Bir alabilirsiniz bir cevap arıyordu enumbir mesafede string, ancak benim durumumda, çeteleler değerleri farklı dize değerleri meslektaşı vardı. OP için basit bir numaralandırma vardı Color, ama farklı bir şey vardı:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
Bir dize Gender.CantTellile çözümlemeye çalıştığınızda , orijinal yanıtla "Can't tell"döner undefined.
Başka bir cevap
Temel olarak, bu cevaptan ilham alan başka bir cevap buldum :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
notlar
- Biz almak ilk sonucu bir
filteristemci enum geçerli bir dize geçiyor varsayarak. Aksi undefinedtakdirde iade edilecektir.
- Biz döküm
enumObjiçin anyçünkü typescript 3.0+ (şu anda typescript 3.5 kullanılarak) ile, enumObjolarak çözümlenir unknown.
Kullanım Örneği
const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
Not: Ve bir yorumda işaret ettiği gibi, ben de kullanmak istedim noImplicitAny.
Güncellenmiş versiyon
Döküm anyve uygun tipler yok.
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];
Ayrıca, güncellenmiş sürüm onu çağırmanın daha kolay bir yoluna sahiptir ve daha okunabilir:
stringToEnumValue(Gender, "Can't tell");
--noImplicitAny(VS işaretlenmemiş "Örtük 'herhangi bir' tür" izin ver). Benim için bunu ürettierror TS7017: Index signature of object type implicitly has an 'any' type.:var color: Color = (<any>Color)[green];(1.4 sürümü ile test edildi)