Je cherchais une réponse qui peut obtenir un enumde a string, mais dans mon cas, les valeurs enums avaient des valeurs de chaîne différentes. L'OP avait une énumération simple Color, mais j'avais quelque chose de différent:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
Lorsque vous essayez de résoudre Gender.CantTellavec une "Can't tell"chaîne, il revient undefinedavec la réponse d'origine.
Une autre réponse
Fondamentalement, j'ai trouvé une autre réponse, fortement inspirée par cette réponse :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
Remarques
- Nous prenons le premier résultat de
filter, en supposant que le client passe une chaîne valide à partir de l'énumération. Si ce n'est pas le cas, undefinedsera retourné.
- Nous convertissons
enumObjen any, car avec TypeScript 3.0+ (utilisant actuellement TypeScript 3.5), le enumObjest résolu comme unknown.
Exemple d'utilisation
const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
Remarque: Et, comme quelqu'un l'a souligné dans un commentaire, je voulais également utiliser le noImplicitAny.
Version mise à jour
Pas de anytranstypage et typages appropriés.
export const stringToEnumValue = <T, K extends keyof T>(enumObj: T, value: string): T[keyof T] | undefined =>
enumObj[Object.keys(enumObj).filter((k) => enumObj[k as K].toString() === value)[0] as keyof typeof enumObj];
De plus, la version mise à jour a un moyen plus simple de l'appeler et est plus lisible:
stringToEnumValue(Gender, "Can't tell");
--noImplicitAny(dans VS non coché "Autoriser les types 'any' implicites"). Il produiterror TS7017: Index signature of object type implicitly has an 'any' type.Pour moi, cela a fonctionné:var color: Color = (<any>Color)[green];(testé avec la version 1.4)