2012-10-11 7 views
22

Ich versuche, ein Merkmal von C# in Typescript nachzuahmen.TypScript-Modul Namespacing in mehreren Dateien

Lassen Sie sagen, ich diese Ordnerstruktur haben

App.ts 
Models/ 
    Person.ts 
    Message.ts 

ich dann in App.ts dies wollen:

module MyAppNamespace { 
    export class ChatApp { 
     User: Models.Person; 
     constructor() => { 
      this.User = new Models.Person("John"); 
      this.User.Message = new Models.Message("Hello World"); 
     } 
    } 
} 

Wie würde ich das tun?

Antwort

33

Hier ist mein Vorschlag. Ich denke, was Sie tun möchten, ist ein Modul zu definieren, das sich über mehrere Quelldateien erstreckt. Um dies zu erreichen, benötigen Sie einen interne Modul wie folgt zu verwenden:

Modelle/Person.ts

module Model { 

    export class Person { 
     name: string; 
     Message : Message; 
     constructor(name: string) { 
      this.name = name; 
     } 
    } 
} 

Modelle/Message.ts

module Model { 
    export class Message { 
     message: string; 
     constructor(message: string) { 
      this.message = message; 
     } 
    } 
} 

App .ts

Wenn Sie diese kompilieren mit

tsc App.ts 

dann sollte alles funktionieren. Beachten Sie, dass das Modul outer in zwei Quelldateien deklariert ist. Da dies ein internes Modul ist, müssen wir dem Compiler mitteilen, dass er in unseren Bereich aufgenommen werden soll, indem ///<reference path='foo.ts'/> Anweisungen hinzugefügt werden.

+0

Funktioniert auch in Visual Studio. Wäre es möglich, nur eine dieser Dateien zu importieren? In VS verwenden Sie normalerweise /// . Wäre das möglich? ZB: ? – Anders

+1

Für zukünftige Referenz ist dies möglich. Sie könnten also eine Datei "allModels.ts" erstellen, die die /// refs enthält. – Anders

+0

warum speichern Person und Nachricht in separaten Dateien? Könnte ich eine Model.ts-Datei nur mit den Klassendefinitionen haben, ohne in ein Modul eingebunden zu sein? Wenn ja, wie würde ich diese Definitionen in App.ts importieren. – FutuToad