2015-06-23 10 views
5

Do tej pory używałem wbudowanych modułów maszynowych i zawierałem 10 s znaczników skryptu, aby załadować aplikację. Obecnie jestem w trakcie przekształcania projektu, aby korzystać z modułów zewnętrznych (przy użyciu przeglądarki internetowej), ale utknąłem na tym, jak powinienem konwertować wyliczenia.Wypisy maszynowe i moduły zewnętrzne (przeglądarka)

kiedyś coś takiego:

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

i chciałbym użyć go w inne moduły jak:

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

i to skompilowany do js poprawnie. Po konwersji projektu na moduły zewnętrzne przeniosłem wszystkie moje interfejsy do plików * .d.ts i pomyślałem o umieszczeniu tam również enum, ale oczywiście spowodowało to błąd, ponieważ nie było odwzorowania między wyliczeniem a liczbą w js . Następnie przeniosłem enumy na pliki * .ts, aby zostały skompilowane. Problem polega na tym, że jeśli piszę je jako:

export enum MyEnum{ 
    one, 
    two, 
    three 
} 

export enum OtherEnum { 
    four, 
    five, 
    six 
} 

która działa na nałożenie na stałe teksty w moim kodu jako:

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

lecz jest niezgodne z typem mymodule.submodule.MyEnum. Więc w jaki sposób mogę mieć zarówno deklarację typu wyliczeniowego, aby można było zadeklarować typy zmiennych w plikach d.ts, ale także mieć rzeczywisty wygenerowany kod enum zależny od (tak, aby był poprawnie załadowany) i używany w pliku .ts ?

Uwaga: te wyliczenia są używane w wielu modułach, więc uwzględnienie ich w tym samym pliku, którego są używane, nie jest rozwiązaniem.

UPDATE o deklaracji interfejsu: to prawdopodobnie nie było jasne, dlaczego ja zachowałem oryginalne deklaracje enum w d.ts plików więc dodaję przykład.

w interfaces.d.ts Obecnie mam:

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

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

o ile wiem, nie mogę przy użyciu instrukcji import plików w .d.ts tak jak mogę użyć jednej deklaracji enum we wszystkich przypadkach?

Odpowiedz

1

Wyliczenia muszą znajdować się w pliku TS, ponieważ wyliczenia są kompilowane do JavaScript. Podczas korzystania z modułów, należy zaimportować enums, aby były używane (nawet jeśli są używane tylko do zdefiniowania typu zmiennej).

Zmień kod do następujących:

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

Również teksty stałe nie powinny być mymodule.submodule jeśli są one zdefiniowane w enums.ts. Usuń je z pliku definicji.

Odnośnie aktualizacji

Aby uzyskać teksty stałe do pracy z interfejsami, można przenieść interfejsów z dokumentacją zgłoszeniową (interfaces.d.ts) i wyeksportować je z pliku wynikowego (ex.interfaces.ts):

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

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

Następnie można użyć interfejsów tak:

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

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

i jak mogę wykorzystać te teksty stałe w deklaracji interfejsu wtedy? Zaktualizuję moje pytanie, aby wyświetlić ten problem. – masimplo

+0

@ mxa055 zasadniczo, przenieś cały kod z plików deklaracji. Edytowałem swoją odpowiedź, aby pokazać przykład. –