Saya mencari jawaban yang bisa mendapatkan enumdari string, tetapi dalam kasus saya, nilai enum memiliki pasangan nilai string yang berbeda. OP memiliki enum sederhana untuk Color, tetapi saya memiliki sesuatu yang berbeda:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
Ketika Anda mencoba menyelesaikan Gender.CantTelldengan "Can't tell"string, itu kembali undefineddengan jawaban yang asli.
Jawaban lain
Pada dasarnya, saya datang dengan jawaban lain, sangat terinspirasi oleh jawaban ini :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
Catatan
- Kami mengambil hasil pertama dari
filter, dengan asumsi klien melewati string yang valid dari enum. Jika tidak demikian, undefinedakan dikembalikan.
- Kami cor
enumObjuntuk any, karena dengan naskah 3.0+ (saat ini menggunakan naskah 3,5), yang enumObjdiselesaikan sebagai unknown.
Contoh Penggunaan
const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
Catatan: Dan, seperti yang ditunjukkan seseorang dalam komentar, saya juga ingin menggunakan noImplicitAny.
Versi terbaru
Tidak ada cor ke anydan pengetikan yang tepat.
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];
Juga, versi yang diperbarui memiliki cara yang lebih mudah untuk menyebutnya dan lebih mudah dibaca:
stringToEnumValue(Gender, "Can't tell");
--noImplicitAny(dalam VS tidak dicentang "Izinkan jenis 'apa pun' tersirat"). Ini menghasilkanerror TS7017: Index signature of object type implicitly has an 'any' type.Bagi saya ini bekerja:var color: Color = (<any>Color)[green];(diuji dengan versi 1.4)