2015-06-23 17 views
5

Fino ad ora stavo usando i moduli interni dattiloscritti e incluso 10 di tag di script per avviare la mia app. Sono attualmente in fase di conversione del progetto per utilizzare i moduli esterni (utilizzando browserify) ma sono bloccato su come dovrei convertire le enumerazioni.Espressioni di dattiloscritto e moduli esterni (browserify)

ho usato per avere qualcosa di simile:

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

e vorrei utilizzarlo in altri moduli come:

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

e questo compilato a JS in modo corretto. Dopo aver convertito il progetto in moduli esterni, ho spostato tutte le mie interfacce in file * .d.ts e ho pensato di inserire l'enumerazione anche lì, ma naturalmente questo ha prodotto un errore poiché non vi era alcuna mappatura tra enum e numero in js . Ho quindi spostato l'enumerazione nei file * .ts in modo che vengano compilati. Il problema è che se li scrivo come:

export enum MyEnum{ 
    one, 
    two, 
    three 
} 

export enum OtherEnum { 
    four, 
    five, 
    six 
} 

che lavora per richiedere le enumerazioni nel mio codice come:

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

MA è compatibile con il tipo mymodule.submodule.MyEnum. Quindi, come posso avere una dichiarazione per il tipo di enum in modo da poter dichiarare tipi di variabili all'interno di file d.ts, ma anche il codice enum generato effettivamente dipende (in modo che venga caricato correttamente) e usato nel file .ts ?

Nota: queste enumerazioni sono utilizzate in molti moduli, quindi includerli nello stesso file utilizzato non è una soluzione.

UPDATE su dichiarazioni di interfaccia: probabilmente non era chiaro il motivo per cui ho mantenuto le dichiarazioni enum originali in d.tS file in modo sto aggiungendo un esempio.

in interfaces.d.ts Al momento ho:

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

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

per quanto ne so che non posso utilizzare istruzioni import in .d.ts file in modo come posso usare una dichiarazione enum in tutti i casi?

risposta

1

Le enumerazioni devono essere in un file TS perché le enumerazioni sono compilate su JavaScript. Quando si utilizzano i moduli, è necessario importare le enumerazioni da utilizzare (anche quando sono solo utilizzate per definire il tipo di una variabile).

modificare il codice al seguente:

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

Inoltre, le enumerazioni non dovrebbe essere in mymodule.submodule se sono definiti in enums.ts. Rimuoverli dal file di definizione.

Per quanto riguarda Aggiornamento

per ottenere l'enumerazioni di lavorare con le interfacce, è possibile spostare le interfacce fuori del file di dichiarazione (interfaces.d.ts) ed esportarli da un file dattiloscritto (es.interfaces.ts):

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

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

quindi è possibile utilizzare le interfacce in questo modo:

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

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

E come posso usare queste enumerazioni in dichiarazioni di interfaccia, allora? Aggiornerò la mia domanda per visualizzare questo problema. – masimplo

+0

@ mxa055 in pratica, sposta tutto il tuo codice dai tuoi file di dichiarazione. Ho modificato la mia risposta per mostrare un esempio. –

Problemi correlati