2012-10-20 16 views
12

Ich frage mich, ob es irgendwie möglich ist, zwei oder mehr Klassen in zwei oder mehr Dateien zu haben, die demselben Modul in TypeScript hinzugefügt wurden. Etwas wie folgt aus:TypeScript-Module

//src/gui/uielement.ts 
module mylib { 
    module gui { 
     export interface UIElement { 
      public draw() : void; 
     } 
    } 
} 

//src/gui/button.ts 
///<reference path='uielement.ts'/> 
module mylib { 
    module gui { 
     export class Button implements UIElement { 
      constructor(public str : string) { } 
      draw() : void { } 
     } 
    } 
} 

Es wird wahrscheinlich Dutzende von GUI-Klassen, also sie alle in der gleichen Datei, die nicht möglich sein wird. Und alle meine Klassen werden im 'Mylib' Modul sein. Aber wie mache ich das?

Wenn die module mylib {...} in eine Funktion übersetzt wird, dann sollte der gesamte Inhalt aller mylib Blöcke in allen Dateien innerhalb derselben Funktion enthalten sein.

Ist das überhaupt möglich?

Wenn ich kompilieren bekomme ich dies:

$ tsc src/gui/button.ts 
src/gui/button.ts(4,39): The name 'UIElement' does not exist in the current scope 
+0

Ja, das unterstützt wird. Nicht sicher, warum du es nicht einfach versucht hast. –

+0

tat ich. Entschuldigung dafür, dass ich den Fehler, den ich bekommen habe, nicht erklärt habe ... werde weiter beschreiben. –

Antwort

22

Das ist genau, wie es funktioniert! Wenn Sie den generierten JavaScript-Code zu buchen, es als eine anonyme Funktion hinzufügen, die ein Objekt übernimmt, die „das Modulobjekt“:

var mylib; 
(function (mylib) { 
    var Button = (function() { 
     function Button(x) { 
      this.x = x; 
     } 
     return Button; 
    })(); 
    mylib.Button = Button;  
})(mylib || (mylib = {})); 

Wenn Sie in der letzten Zeile sehen (})(mylib || (mylib = {}));) Sie sehen, dass es sich um einen instanziiert new ojbect (mylib = {}) nur, wenn die vorhandene Variable false ist (oder etwas, das zu false, wie null, ausgewertet wird). Auf diese Weise werden alle "Module", die denselben Namen haben, mit demselben Objekt zusammengeführt.

Daher erweitern sich interne Module gegenseitig. Ich muss feststellen, dass ich nicht ganz herausgefunden habe, was mit verschachtelten Modulen passiert.

Update: Ihr Code funktioniert für mich, wenn ich nicht die verschachtelte Modul-Syntax, sondern ändern Sie es in die Punkt-Syntax. z.B .:

module mylib.gui { 
} 

statt

module mylib { 
    module gui { 
    } 
} 

Ich werde versuchen, in zu untersuchen, warum dies geschieht, so weit ich die Spezifikation gelesen haben, sollten beide Richtungen gleich sein.

Update: wenn das verschachtelte referenzierten Modul als exportiert markiert ist, funktioniert es:

module mylib { 
    export module gui { 
    } 
}