2015-06-23 6 views
5

Bis jetzt benutzte ich typescript interne Module und enthielt 10s von Script-Tags, um meine App zu starten. Ich bin gerade dabei, das Projekt auf externe Module umzustellen (mit browserify), aber ich stehe fest, wie ich Enums konvertieren soll.Typescript enums und externe Module (browserify)

Früher habe ich wie etwas haben:

mymodule.submodule { 
    enum MyEnum { 
     one, 
     two, 
     three 
    } 
} 

und ich würde es in anderen Modulen wie verwenden:

var val:mymodule.submodule.MyEnum = mymodule.submodule.MyEnum.one; 

und diese richtig js zusammengestellt. Nachdem ich das Projekt auf externe Module umgestellt habe, habe ich alle meine Interfaces in * .d.ts Dateien verschoben und dachte daran, auch die Enums dort einzutragen, aber das führte natürlich zu einem Fehler, da es in js keine Zuordnung zwischen Enumeration und Nummer gab . Ich habe dann die Enums in * .ts Dateien verschoben, so dass sie kompiliert werden. Das Problem ist, dass, wenn ich schreibe sie als:

export enum MyEnum{ 
    one, 
    two, 
    three 
} 

export enum OtherEnum { 
    four, 
    five, 
    six 
} 

, die als für die Forderung, die Aufzählungen in meinem Code funktioniert:

import Enums = require('./enums'); 
var val = Enums.MyEnum.one; //this works 
var val1: mymodule.submodule.MyEnum = Enums.MyEnum.one; //ERROR: incompatible types 

, ist aber nicht mit dem mymodule.submodule.MyEnum Typ. Also wie kann ich eine Deklaration für den Enum-Typ haben, so kann ich Variablentypen in D.ts-Dateien deklarieren, aber auch den tatsächlichen generierten enum-Code abhängig (damit es korrekt geladen wird) und in .ts-Datei verwendet ?

Hinweis: Diese Enums werden in vielen Modulen verwendet, sodass es keine Lösung ist, sie in derselben Datei zu verwenden, in der sie verwendet werden.

UPDATE über Schnittstelle Erklärungen: es war wohl nicht klar, warum ich die ursprünglichen Enum Erklärungen in d.ts gehalten Dateien so ein Beispiel ich hinzufügen.

in interfaces.d.ts Ich habe derzeit:

declare module mymodule.submodule { 
    enum MyEnum{ 
     one, 
     two, 
     three 
    } 

    interface ISomething{ 
     aValue: MyEnum; 
     aFunction: (anArg: MyEnum) => void; 
    } 
} 

soweit ich weiß, dass ich nicht Import-Anweisungen in .d.ts verwenden, können Dateien so wie kann ich eine Enum-Deklaration in allen Fällen verwenden?

Antwort

1

Die Enums müssen in einer TS-Datei enthalten sein, da Enums in JavaScript kompiliert werden. Bei der Verwendung von Modulen müssen Enums zur Verwendung importiert werden (selbst wenn nur der Typ einer Variablen definiert wird).

Ändern Sie den Code wie folgt:

import Enums = require('./enums'); 
var val1: Enums.MyEnum = Enums.MyEnum.one; // no error 

Auch sind die Aufzählungen nicht in mymodule.submodule sein sollten, wenn sie in enums.ts definiert sind. Entfernen Sie sie aus der Definitionsdatei.

In Bezug auf Update-

Um die Aufzählungen zu bekommen mit den Schnittstellen zu arbeiten, können Sie die Schnittstellen aus der Deklarationsdatei (interfaces.d.ts) bewegen und sie von einer Typoskript Datei (ex exportieren.interfaces.ts):

import Enums = require('./enums'); 

export interface ISomething { 
    aValue: Enums.MyEnum; 
    aFunction: (anArg: Enums.MyEnum) => void; 
} 

Dann können Sie die Schnittstellen wie so verwenden:

import Interfaces = require('./interfaces'); 
import Enums = require('./enums'); 

var example: Interfaces.ISomething = { 
    aValue: Enums.MyEnum.one, 
    aFunction: (example: Enums.MyEnum) => { console.log('example'); } 
}; 
+0

Und wie kann ich diese Aufzählungen in Interface-Deklarationen dann verwenden? Ich werde meine Frage aktualisieren, um dieses Problem anzuzeigen. – masimplo

+0

@ mxa055 im Grunde, bewegen Sie Ihren gesamten Code aus Ihren Deklarationsdateien. Ich habe meine Antwort bearbeitet, um ein Beispiel zu zeigen. –

Verwandte Themen