Comment convertir string en enum en TypeScript?
j'ai défini suivant enum en dactylographié?
enum Color{
Red, Green
}
maintenant dans ma fonction je reçois la couleur comme chaîne. J'ai essayé le code suivant.
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
comment convertir cette valeur en enum?
7 réponses
enum en TypeScript 0.9 est basé sur la chaîne de caractères+le nombre. Vous ne devriez pas avoir besoin d'assertion de type pour les conversions simples:
enum Color{
Red, Green
}
// To String
var green: string = Color[Color.Green];
// To Enum / number
var color : Color = Color[green];
j'ai de la documentation à ce sujet et d'autres motifs Enum dans mon livre OSS: https://basarat.gitbooks.io/typescript/content/docs/enums.html
comme dans le cas de la typographie 2.1 Les clés de chaîne de caractères dans les enums sont fortement dactylographié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 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
cette note se rapporte à la réponse de basarat , et non à la question initiale.
j'ai eu un problème étrange dans mon propre projet où le compilateur donnait une erreur à peu près équivalente à "ne peut pas convertir chaîne en couleur" en utilisant l'équivalent de ce code:
var colorId = myOtherObject.colorId; // value "Green";
var color: Color = <Color>Color[colorId]; // TSC error here: Cannot convert string to Color.
j'ai trouvé que le type de compilateur inférant devenait confus et il a pensé que colorId
était une valeur enum et pas un ID. Pour résoudre le problème que j'ai eu pour lancer L'ID comme une chaîne de caractères:
var colorId = <string>myOtherObject.colorId; // Force string value here
var color: Color = Color[colorId]; // Fixes lookup here.
Je ne sais pas ce qui a causé le problème, mais je vais laisser cette note ici au cas où quelqu'un rencontrerait le même problème que moi.
fonctionne avec le code suivant.
var green= "Green";
var color : Color= <Color>Color[green];
si vous êtes sûr qu'une chaîne de caractères correspond exactement à la couleur enum, alors utilisez:
const color: Color = (<any>Color)["Red"];
dans le cas où une chaîne de caractères peut ne pas correspondre à L'utilisation D'Enum:
const mayBeColor: Color | undefined = (<any>Color)["WrongInput"];
if(mayBeColor !== undefined){
//TSC will understand that mayBeColor of type Color here
}
si nous ne moulons pas le type enum
à <any>
alors tsc affichera l'erreur
élément implicitement de type "any" parce que l'expression d'index n'est pas de type "nombre".
signifie que le type TSENUM fonctionne par défaut avec des index numériques, c'est-à-dire
let c = Color[0]
, mais pas avec des index comme let c = Color["string"]
. Il s'agit d'une restriction connue par Microsoft team pour l'édition plus générale Object string indexes .
j'ai aussi rencontré la même erreur de compilation. Juste une petite variation plus courte de L'approche de Sly_cardinal.
var color: Color = Color[<string>colorId];
si le compilateur typescript sait que le type de variable est chaîne que cela fonctionne
let colorName : string = "Green";
let color : Color = Color[colorName];
sinon vous devriez le convertir explicitement en chaîne (pour éviter l'avertissement du compilateur)
let colorName : any = "Green";
let color : Color = Color["" + colorName];
à l'exécution les deux solutions fonctionneront.