web-dev-qa-db-de.com

Warum verwendet TypeScript das Schlüsselwort "export", um Klassen und Schnittstellen öffentlich zu machen?

Während ich mich mit TypeScript beschäftigte, stellte ich fest, dass meine Klassen in Modulen (die als Namespaces verwendet wurden) nicht für andere Klassen verfügbar waren, es sei denn, ich habe das Schlüsselwort export davor geschrieben, wie zum Beispiel:

module some.namespace.here
{
   export class SomeClass{..}
}

So, jetzt kann ich den obigen Code wie folgt verwenden:

var someVar = new some.namespace.here.SomeClass();

Ich habe mich nur gefragt, warum dieses Schlüsselwort verwendet wird und nicht nur das Schlüsselwort public, das auf Methodenebene verwendet wird, um anzuzeigen, dass auf eine Methode oder Eigenschaft von außen zugegriffen werden soll. Warum also nicht einfach denselben Mechanismus verwenden, um Klassen und Schnittstellen usw. extern sichtbar zu machen?

Dies würde folgenden Code ergeben:

module some.namespace.here
{
   public class SomeClass{..}
}
121
Grofit

Der Hauptgrund ist, dass export den Plänen für ECMAScript entspricht. Man könnte argumentieren, dass sie "export" anstelle von "public" hätten verwenden sollen, aber abgesehen davon, dass "export/private/protected" eine schlecht passende Menge von Zugriffsmodifikatoren ist, glaube ich, dass es einen subtilen Unterschied zwischen den beiden gibt, der dies erklärt .

In TypeScript hat das Markieren eines Klassenmitglieds als public oder private keine Auswirkung auf das generierte JavaScript. Es handelt sich lediglich um ein Tool zum Entwerfen/Kompilieren, mit dem Sie verhindern können, dass Ihr TypeScript-Code auf Dinge zugreift, auf die er nicht zugreifen sollte.

Mit dem Schlüsselwort export fügt das JavaScript eine Zeile hinzu, um das exportierte Element zum Modul hinzuzufügen. In deinem Beispiel: here.SomeClass = SomeClass;.

Konzeptionell dient die Sichtbarkeit, die durch public und private gesteuert wird, nur zur Bearbeitung, während das Schlüsselwort export die Ausgabe ändert.

159
Fenton

Ein paar Dinge, die Sie zu Steve Fentons Antwort hinzufügen sollten:

  • exportbereits bedeutet zwei verschiedene Dinge (abhängig davon, ob es sich auf oberster Ebene befindet oder nicht); es bedeutet, dass ein Drittel wahrscheinlich schlimmer ist als das Hinzufügen von public/private
  • Es geht definitiv nicht darum, die Implementierung zu vereinfachen. Die zusätzliche Komplexität von public vs export ist trivial. Wir haben bereits einige Keywords geändert. es ist nicht schwer.
  • Die Standardsichtbarkeit von Klassenmitgliedern muss public sein, um mit dem ES6-Klassenvorschlag übereinzustimmen. Daher benötigen wir ein Schlüsselwort, um "not public" anzugeben. Es gibt kein geeignetes Antonyme für export (unexport ??), daher ist private die logische Wahl. Sobald Sie private haben, wäre es etwas verrückt, public nicht als Gegenstück zu wählen
  • Die Verwendung von export zum Ändern der Sichtbarkeit in internen Modulen ist die bestmögliche Ausrichtung mit ES6-Modulen
45
Ryan Cavanaugh