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?

146
demandé sur Amitabh 2013-06-29 17:45:41

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];

Essayer en ligne

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

232
répondu basarat 2015-10-13 23:57:52

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

46
répondu Victor 2017-07-21 05:47:55

fonctionne avec le code suivant.

var green= "Green";
var color : Color= <Color>Color[green];
16
répondu Amitabh 2013-06-29 13:50:01

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
}

terrain de jeu


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 .

13
répondu Artru 2017-01-09 12:47:53

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];
8
répondu Chris 2015-08-20 12:20:18

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.

7
répondu Luka 2016-08-17 06:37:15