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{..}
}
Author: MasterScrat, 2013-04-02

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.

 138
Author: user75525,
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ż dodanie public / private
  • to zdecydowanie nie po to, aby ułatwić implementację; dodatkowa złożoność public vs export 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 masz private, 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ć.]}
 42
Author: Ryan Cavanaugh,
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