Dlaczego Typescript używa słowa kluczowego "export" do upubliczniania klas i interfejsów?
Podczas pracy z maszynopisem zdałem sobie sprawę, że moje klasy wewnątrz modułów (używane jako przestrzenie nazw) nie są dostępne dla innych klas, chyba że napisałem przed nimi słowo kluczowe export
, takie jak:
module some.namespace.here
{
export class SomeClass{..}
}
Więc teraz mogę użyć powyższego kodu tak:
var someVar = new some.namespace.here.SomeClass();
Jednak zastanawiałem się, dlaczego to słowo kluczowe jest używane w przeciwieństwie do słowa kluczowego public
, które jest używane na poziomie metody, aby oznaczać, że metoda lub właściwość powinny być dostępne zewnętrznie. Więc dlaczego po prostu nie użyć tego samego mechanizm tworzenia klas i interfejsów itp.?
To daje kod wynikowy w postaci:
module some.namespace.here
{
public class SomeClass{..}
}
2 answers
Głównym powodem jest to, że export
pasuje do planów ECMAScript. Można by argumentować ,że "powinni byli użyć "export" zamiast "public" , ale poza tym, że" export/private/protected " jest słabo dopasowanym zestawem modyfikatorów dostępu, uważam, że istnieje subtelna różnica między tymi dwoma, która to wyjaśnia.
W języku TypeScript oznaczanie członka klasy jako public
lub private
nie ma wpływu na generowany JavaScript. Jest to po prostu narzędzie do projektowania / kompilacji, którego możesz użyć, aby zatrzymać swój Kod maszynopisu umożliwia dostęp do rzeczy, których nie powinien.
Za pomocą słowa kluczowego export
JavaScript dodaje linię, aby dodać wyeksportowany element do modułu. W twoim przykładzie: here.SomeClass = SomeClass;
.
Więc koncepcyjnie widoczność jako kontrolowana przez public
i private
jest tylko dla narzędzi, podczas gdy słowo kluczowe export
zmienia wyjście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 21:35:16
Kilka rzeczy do dodania do odpowiedzi Steve ' a Fentona:
-
export
już oznacza dwie różne rzeczy (w zależności od tego, czy jest na najwyższym poziomie, czy nie); zrobienie z niego trzeciej rzeczy jest prawdopodobnie gorsze niż dodaniepublic
/private
- to zdecydowanie nie po to, aby ułatwić implementację; dodatkowa złożoność
public
vsexport
jest trywialna. Zmieniliśmy już słowa kluczowe wokół kilku; To nie jest trudne. - domyślna widoczność członków klasy musi być publiczne aby dostosować się do propozycji klasy ES6, dlatego potrzebujemy jakiegoś słowa kluczowego, aby wskazać "Nie publiczne". Nie ma odpowiedniego antonimu do
export
(unexport
??), więc {[2] } jest logicznym wyborem. Gdy maszprivate
, byłoby nieco szalone Nie wybraćpublic
jako swojego odpowiednika
Dzięki temu, że moduły ES6 są dostępne w wielu wersjach językowych, można je łatwo modyfikować.]}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-20 16:34:18