2013-04-02 10 views
90

Während mit Typoskript Dilettantismus ich meine Klassen innerhalb von Modulen (als Namensraum) realisiert wurden auf andere Klassen nicht zur Verfügung, wenn ich das export Schlüsselwort vor ihnen, wie geschrieben:Warum verwendet Typescript das Schlüsselwort "export", um Klassen und Schnittstellen öffentlich zu machen?

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

ich den obigen Code verwenden kann also jetzt wie folgt aus:

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

aber ich gerade fragen, warum dieses Schlüsselwort des public Schlüsselwort nur im Gegensatz verwendet wird verwendet, die bei Verfahren Ebene verwendet wird, um anzuzeigen, dass eine Methode oder Eigenschaft soll von außen zugänglich sein. Warum also nicht einfach denselben Mechanismus verwenden, um Klassen und Interfaces usw. von außen sichtbar zu machen?

Dies würde resultierenden Code geben wie:

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

Antwort

118

Der Hauptgrund ist, dass export die Pläne für ECMAScript entspricht. Man könnte argumentieren, dass Export ‚anstelle von‚public „sie verwendet haben sollte‘,‘aber asides von‚Export/private /‘geschützt einen schlecht aufeinander abgestimmten Satz von Zugriffsmodifikatoren zu sein, ich glaube, es gibt einen feinen Unterschied zwischen den beiden ist, dass dies erklärt .

In Typoskript, hat einen Teilnehmer als public oder private auf dem erzeugten JavaScript keine Wirkung Markierung. es ist einfach ein Design/Zeit-Tool kompilieren, die Sie sollte es Ihr Typoskript Code Zugriff auf die Dinge zu stoppen, nicht

nutzen können.

Mit dem export Schlüsselwort, fügt der JavaScript eine Zeile der exportierten Artikel zum Modul hinzufügen In Ihrem Beispiel:.. here.SomeClass = SomeClass;

So

Konzeptionell Sichtbarkeit wie durch public und private gesteuert ist nur für Werkzeuge, während das Schlüsselwort export die Ausgabe ändert.

+1

Dank für die Informationen, ich nehme an, dass die Entscheidung war, wie Sie sagen, um zu vermeiden, den Kontext des Keywords zu überprüfen, was eine Schande ist, wie es etwas ist, das ein paar Leute stolpern wird und wirklich keine logische hat Unterschied in Verhalten, wie Sie erwarten, dass die Öffentlichkeit zu handeln, macht nur ihre Umsetzung einfacher. – Grofit

+0

Danke dafür. Spart mir die Haare ziehen. –

38

Ein paar Dinge zu Steve Fenton Antwort hinzuzufügen:

  • exportbereits bedeutet zwei verschiedene Dinge (je nachdem, ob es auf der obersten Ebene oder nicht); so dass es ein Drittel bedeuten ist wahrscheinlich schlimmer als public/private
  • Hinzufügen Es ist definitiv nicht die Umsetzung zu erleichtern; die zusätzliche Komplexität von public vs export ist trivial. Wir haben die Keywords bereits um einiges geändert. es ist nicht schwer.
  • Die Standard-Sichtbarkeit der Klassenmitglieder müssen sein Publikum mit dem ES6 Klasse Vorschlag auszurichten, deshalb müssen wir einige Keyword „nicht öffentlich“, um anzuzeigen. Es gibt kein geeignetes Antonym zu export (unexport ??), so private die logische Wahl. Sobald Sie private haben, wäre es etwas verrückt sein, nicht public als sein Pendant
  • Verwendung von export zu ändern Sichtbarkeit in interner Module zu wählen ist die richtige erraten Ausrichtung mit ES6 Module
+1

danke für die zusätzlichen Informationen, ich stimme völlig mit dem öffentlichen/privaten Wesen auf Mitgliederebene, ich fand es nur seltsam, nicht für alle Ebenen des Zugangs zu sein. Dies ist jedoch eine persönliche Meinung und ein Keyword ist ein Keyword, wollte nur mehr herausfinden. – Grofit

+3

Ich redigiere meine freche Aussage über die Einfachheit der Implementierung und biete eine +1 als Entschuldigung :) – Fenton

+0

Ich bin verwirrt durch den ersten Punkt. Wer schlägt vor, dass "Export" eine dritte Bedeutung haben sollte? – gravidThoughts

-4

Eigentlich ist es für Knoten ist. js Kompatibilität.

Wenn man sich die transpiled Code sucht:

export function foo(){ 
} 

Sie erhalten:

function foo(){ 
} 
exports.foo = foo; 

, die die Knoten-Syntax ist.

+4

Das hat nichts mit Node zu tun. Die zwei vorhandenen Antworten, von denen eine von einem der Sprachdesigner veröffentlicht wurde, sind genau richtig. – Stijn

+1

Sieht so aus, als hättest du vor der Beantwortung noch nichts recherchiert oder gelesen ... – WilomGfx

+0

Ja, ich hätte mehr recherchieren sollen. Kann ich diese Antwort entfernen? Ich sehe keinen offensichtlichen Weg in der Benutzeroberfläche, dies zu tun. – Eugene