Comment convertir une chaîne en enum dans TypeScript?

J’ai défini l’énumération suivante dans TypeScript?

enum Color{ Red, Green } 

Maintenant, dans ma fonction, je reçois de la couleur sous forme de chaîne. J’ai essayé le code suivant.

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

Comment puis-je convertir cette valeur en enum?

Les énumérations dans TypeScript 0.9 sont basées sur chaîne + nombre. Vous ne devez pas avoir besoin d’affirmation de type pour des conversions simples:

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

Essayez-le en ligne

J’ai une documentation à ce sujet et d’autres modèles Enum dans mon livre OSS: https://basarat.gitbooks.io/typescript/content/docs/enums.html

A partir de Typescript 2.1, les clés de chaîne dans les énumérations sont fortement typées. keyof typeof est utilisé pour obtenir des informations sur les clés de chaîne disponibles ( 1 ):

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

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

Cette note concerne la réponse de Basarat, pas la question originale.

J’ai eu un problème étrange dans mon propre projet où le compilateur donnait une erreur à peu près équivalente à “impossible de convertir une chaîne en couleur” en utilisant l’équivalent de ce code:

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

J’ai trouvé que l’inférence de type de compilateur devenait confuse et il a pensé que colorId était une valeur d’énumération et non un ID. Pour résoudre le problème, j’ai dû convertir l’ID en chaîne:

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

Je ne suis pas sûr de ce qui a causé le problème, mais je vais laisser cette note ici au cas où quelqu’un aurait le même problème que moi.

Il a fonctionné en utilisant le code suivant.

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

Si vous êtes sûr qu’une chaîne d’entrée correspond exactement à Color enum, utilisez:

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

Dans le cas où une chaîne d’entrée ne correspondrait pas à l’utilisation d’Enum:

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

Cour de récréation


Si nous ne enum pas enum à tapez alors tsc affichera l’erreur

L’élément a implicitement le type “any” car l’expression d’index n’est pas du type “number”.

Cela signifie que, par défaut, le type TS Enum fonctionne avec des index de nombres, c.-à let c = Color[0] d. let c = Color[0] , mais pas avec des index de type ssortingng let c = Color["ssortingng"] . Il s’agit d’une ressortingction connue de l’équipe Microsoft pour les index de chaînes d’objects plus généraux.

J’ai également rencontré la même erreur de compilation. Juste une légère variation de l’approche de Sly_cardinal.

 var color: Color = Color[colorId]; 

Si le compilateur typecript sait que le type de variable est ssortingng, cela fonctionne

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

sinon vous devriez explicitement le convertir en chaîne (pour éviter les avertissements du compilateur)

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

A l’exécution, les deux solutions fonctionneront.