2012-10-14 10 views
22

Angenommen, ich möchte eine Klasse pro .ts-Datei haben. Ich habe zwei .ts Dateien, die wie so aussehen:Wie fügen Sie in TypeScript mehrere externe Module in denselben Namespace ein?

export module MyClasses { export class A {} } 

und

export module MyClasses { export class B {} } 

Ich kann das nicht tun:

import MyClasses = module('A'); 
import MyClasses = module('B'); 

Wie kann ich definieren Klassen in separaten Dateien und sie in den gleichen "Namensraum" legen? Darüber hinaus wir am Ende so etwas wie zu tun haben:

MyClasses.MyClasses.A 

statt

MyClasses.A 

Was ist der Sinn dieser zusätzlichen Ebene der Hierarchie? Damit Sie mehr als ein exportiertes Modul in einer Moduldatei haben können? Die beste Lösung, die ich bisher herausgefunden habe, ist das Entfernen des "Exportmoduls" (da "Exportklasse" beim Kompilieren von AMD ausreichend ist), was die Klasse um eine hierarchische Ebene nach oben verschiebt. Dann:

import AModule = module('A'); 
module MyClasses{ var A = AModule.A; } 
import BModule = module('B'); 
module MyClasses { var B = BModule.B; } 

Obwohl es perfekt funktioniert, ist es nicht gerade prägnant. Gibt es dafür keinen besseren Weg?

+1

Ich habe eine Feature-Anfrage für ein Keyword gemacht, das in etwa so funktioniert: http://typescript.codeplex.com/workitem/305 – Brent

Antwort

1

Entschuldigen Sie die armen Variablennamen, ich habe das in Visual Studio getestet. Es funktionierte für mich, wenn ich verschiedene Namen für die Importanweisungen verwendete.

import x = module('A'); 
import y = module('B'); 

x.MyClasses.A; 
y.MyClasses.B; 

Alternativ können Sie Referenz Kommentare zu einem ähnlichen Effekt verwenden, aber das ist besser, wenn Sie bündeln, nicht, wenn Sie das Laden der Module verwenden. Sie müßten das export Stichwort von Ihren zwei MyClasses Erklärungen fallen zu lassen:

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

var x = MyClasses.A; 
3

Ich glaube nicht, dass es ein besserer Weg, dies mit externer Module zu erreichen. Die Sprachspezifikation definiert externe Module wie folgt:

Externe Module (Abschnitt 9.4) sind separat geladene Codesätze, die mit externen Modulnamen referenziert werden. Ein externes Modul wird als separate Quelldatei geschrieben, die mindestens eine Import- oder Exportdeklaration enthält.

Weiter unten heißt es, dass interne Module sind offen beendet und können mehrere Dateien erstrecken sich über:

Interne Module „open-ended“ und interne Modul Deklarationen mit dem gleichen qualifizierten Namen bezüglich zu eine gemeinsame Wurzel (wie in Abschnitt 2.2 definiert) trägt zu einem einzelnen Modul bei.

Ich fand keine andere Erwähnung einer ähnlichen Aussage für externe Module. Ich bin ziemlich überzeugt, dass es das nicht ist. Wenn Sie Module laden müssen, müssen Sie mit Referenzpfaden leben, um auf Typen zuzugreifen, die aus verschiedenen Dateien geladen wurden.

Aber für mich klingt es wie Sie lieber für interne Module gehen würden.Dann können Sie einfach verteilen Ihr Modul über zwei Dateien

export module MyClasses { export class A {} } 

und

export module MyClasses { export class B {} } 

bringen sie in Umfang mit Referenzpfade

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

und dann einfach mit dem Modulnamen verweisen wie z.B

var a = new MyClasses.A(); 
+6

Während der 'referenz'-Kommentar möglicherweise Ihr Lieblings-TypeScript macht IDE glücklich, es wird nicht Ihr Modul zur Laufzeit laden. –

8

Leider gibt es keine perfekte Lösung zu sein scheint, aber das ist, wie ich es jetzt gelöst:

Datei ‚Controller/MainController.ts‘:

class MainController { 
    ... 
} 

export = MainController; 

Datei ‚Controller /SecondController.ts':

class SecondController { 
    ... 
} 

export = SecondController; 

Datei 'Controller/Namespace.ts':

import MainController = require('./MainController'); 
import SecondController = require('./SecondController'); 

export = { MainController, SecondController } 

Datei ‚App.ts‘ (wo die ‚Namespace‘ verwendet wird)

import Controllers = require('Controllers/Namespace'); 

angular.module('app', []) 
    .controller('MainController', Controllers.MainController) 
    .controller('SecondController', Controllers.SecondController) 

Diese Sie schöne intellisense gibt, versteckt die 400 Import-Anweisungen entfernt und hält den Code, in dem der Namensraum tatsächlich ist Used pretty clean ...

+0

Sie müssen möglicherweise das folgende Formular verwenden: ' Export * von" ./MainController "; Export * von "./SecondController"; ' in Namespace.ts – pennyowe

Verwandte Themen