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

135

Während ich mich mit Typescript beschäftigte, stellte ich fest, dass meine Klassen in Modulen (die als Namespaces verwendet wurden) anderen Klassen nur zur Verfügung standen, wenn ich das exportSchlüsselwort vor ihnen geschrieben hatte, wie z.

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

Jetzt kann ich den obigen Code folgendermaßen verwenden:

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

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

Dies würde den resultierenden Code ergeben wie:

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

Antworten:

176

Der Hauptgrund ist, dass es exportden Plänen für ECMAScript entspricht. Sie könnten argumentieren, dass "sie" export "anstelle von" public "hätten verwenden sollen, aber abgesehen davon, dass" export / private / protected "ein schlecht passender Satz 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 publicoder privatekeine Auswirkung auf das generierte JavaScript. Es ist einfach ein Design- / Kompilierungszeit-Tool, mit dem Sie verhindern können, dass Ihr TypeScript-Code auf Dinge zugreift, die er nicht sollte.

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

Konzeptionell wird die Sichtbarkeit von publicund privatenur für Werkzeuge gesteuert , während das exportSchlüsselwort die Ausgabe ändert.

Fenton
quelle
1
Vielen Dank für die Informationen. Ich gehe davon aus, dass die Entscheidung, wie Sie sagen, getroffen wurde, um zu vermeiden, dass der Kontext des Keywords überprüft werden muss. Dies ist eine Schande, da es sich so anfühlt, als würde es ein paar Leute stören und wirklich keinen logischen Unterschied im Verhalten aufweisen Wie Sie erwarten, dass die Öffentlichkeit handelt, erleichtert nur deren Umsetzung.
Grofit
Danke dafür. Spart mir das Ziehen der Haare.
Kent Aguilar
1
Dies ist erforderlich, wenn Sie Module verwenden. Wenn Ihre App eher auf der größeren Seite liegt, sind Module in der Regel die bessere Wahl, als große Bundles zu erstellen oder alle Ihre Dateien im Voraus zu laden.
Fenton
@Fenton Meinten Sie nicht "Sie könnten argumentieren, dass sie" öffentlich "anstelle von" Export "hätten verwenden sollen?
Alan Evangelista
@AlanEvangelista Sie könnten es sicherlich auch so argumentieren, besonders wenn Ihr Hintergrund Java / C # und nicht JavaScript war.
Fenton
49

Ein paar Dinge, die Steve Fentons Antwort ergänzen sollten:

  • export bedeutet bereits zwei verschiedene Dinge (je nachdem, ob es auf oberster Ebene ist 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 publicvs exportist trivial. Wir haben bereits einige Keywords geändert. es ist nicht schwer.
  • Die Standardsichtbarkeit von Klassenmitgliedern muss öffentlich sein, um mit dem ES6-Klassenvorschlag übereinzustimmen. Daher benötigen wir ein Schlüsselwort, um "nicht öffentlich" anzugeben. Es gibt kein geeignetes Antonyme für export( unexport??), daher privateist dies die logische Wahl. Sobald Sie haben private, wäre es etwas verrückt, nicht publicals Gegenstück zu wählen
  • Die Verwendung von exportzum Ändern der Sichtbarkeit in internen Modulen ist die bestmögliche Ausrichtung mit ES6-Modulen
Ryan Cavanaugh
quelle
1
Vielen Dank für die zusätzlichen Informationen. Ich stimme voll und ganz dem öffentlichen / privaten Wesen auf Mitgliedsebene zu. Ich fand es nur seltsam, dass es nicht für alle Zugriffsebenen ausreicht. Dies ist jedoch eine persönliche Meinung und ein Schlüsselwort ist ein Schlüsselwort, ich wollte nur mehr herausfinden.
Grofit
5
Ich redigiere meine freche Aussage über die einfache Implementierung und biete eine +1 als Entschuldigung an :)
Fenton
2
Ich stimme einigen Ihrer Aussagen zu, bin aber mit der Aussage "Es gibt kein geeignetes Antonyme zum Exportieren" nicht einverstanden - "Importieren" ist das Antonyme und wird von TypeScript verwendet, wenn Sie eine exportierbare Klasse definieren Importieren Sie es in andere Dateien. export class User { name: string } Eine andere Datei: import {User} from ""./the_file_path_to_the_user_class; siehe Abschnitt 3.3 der Nativescript-Dokumente hier docs.nativescript.org/angular/tutorial/ng-chapter-3
Adam Diament
3
Wie wäre die Verwendung importder Angabe "Dieser Wert wird nicht exportiert " eine geeignete Verwendung des Schlüsselworts?
Ryan Cavanaugh
5
"Es gibt kein geeignetes Antonyme für den Export (nicht exportiert?)" - ein geeignetes Antonyme für den Export sollte ein Embargo sein.
rsp