Je cherchais une réponse qui peut obtenir un enum
de 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.CantTell
avec une "Can't tell"
chaîne, il revient undefined
avec 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, undefined
sera retourné.
- Nous convertissons
enumObj
en any
, car avec TypeScript 3.0+ (utilisant actuellement TypeScript 3.5), le enumObj
est 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 any
transtypage 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)