Come convertire string in enum in TypeScript?

Ho definito la seguente enum in TypeScript?

enum Color{ Red, Green } 

Ora nella mia funzione ricevo il colore come stringa. Ho provato il seguente codice.

 var green= "Green"; var color : Color = green; // Error: can't convert string to enum 

Come posso convertire quel valore in enum?

Enums in TypeScript 0.9 sono basati su string + numero. Non dovresti aver bisogno di asserzioni di tipo per conversioni semplici:

 enum Color{ Red, Green } // To String var green: string = Color[Color.Green]; // To Enum / number var color : Color = Color[green]; 

Provalo online

Ho una documentazione su questo e altri modelli Enum nel mio libro OSS: https://basarat.gitbooks.io/typescript/content/docs/enums.html

A partire da Typescript 2.1 le chiavi di stringa nell’enumerazione sono fortemente tipizzate. keyof typeof è usato per ottenere informazioni sulle chiavi stringa disponibili ( 1 ):

 enum Color{ Red, Green } let typedColor: Color = Color.Green; let typedColorString: keyof typeof Color = "Green"; // Error "Black is not assignable ..." (indexing using Color["Black"] will return undefined runtime) typedColorString = "Black"; // Error "Type 'string' is not assignable ..." (indexing works runtime) let letColorString = "Red"; typedColorString = letColorString; // Works fine typedColorString = "Red"; // Works fine const constColorString = "Red"; typedColorString = constColorString // Works fine (thanks @SergeyT) let letColorString = "Red"; typedColorString = letColorString as keyof typeof Color; typedColor = Color[typedColorString]; 

https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types

Questa nota si riferisce alla risposta di Basarat, non alla domanda originale.

Ho avuto un problema strano nel mio progetto in cui il compilatore stava dando un errore approssimativamente equivalente a “non può convertire la stringa in colore” usando l’equivalente di questo codice:

 var colorId = myOtherObject.colorId; // value "Green"; var color: Color = Color[colorId]; // TSC error here: Cannot convert string to Color. 

Ho scoperto che l’inferenza del tipo di compilatore si stava confondendo e pensava che colorId fosse un valore enum e non un ID. Per risolvere il problema ho dovuto eseguire il cast dell’ID come stringa:

 var colorId = myOtherObject.colorId; // Force string value here var color: Color = Color[colorId]; // Fixes lookup here. 

Non sono sicuro di cosa abbia causato il problema, ma lascerò qui questa nota nel caso in cui qualcuno si imbatta nello stesso problema che ho riscontrato.

Ho funzionato usando il seguente codice.

 var green= "Green"; var color : Color= Color[green]; 

Se sei sicuro che una stringa di input abbia una corrispondenza esatta con Color enum, usa:

 const color: Color = (Color)["Red"]; 

Nel caso in cui una stringa di input non corrisponda a Enum, utilizzare:

 const mayBeColor: Color | undefined = (Color)["WrongInput"]; if(mayBeColor !== undefined){ //TSC will understand that mayBeColor of type Color here } 

Terreno di gioco


Se non enum su type allora tsc mostrerà l’errore

L’elemento ha implicitamente il tipo ‘any’ perché l’espressione dell’indice non è di tipo ‘numero’.

Significa che per impostazione predefinita il tipo TS Enum funziona con indici numerici, ovvero let c = Color[0] , ma non con indici di stringa come let c = Color["string"] . Questa è una restrizione conosciuta dal team di Microsoft per un numero più generale di indici stringa di oggetti .

Ho anche avuto lo stesso errore del compilatore. Solo una leggera variazione più breve dell’approccio di Sly_cardinal.

 var color: Color = Color[colorId]; 

Se il compilatore di dattiloscritti sa che il tipo di variabile è una stringa di quanto funzioni

 let colorName : string = "Green"; let color : Color = Color[colorName]; 

altrimenti dovresti convertirlo esplicitamente in stringa (per evitare l’avvertimento del compilatore)

 let colorName : any = "Green"; let color : Color = Color["" + colorName]; 

A runtime entrambe le soluzioni funzioneranno.