TypeScriptの仕様上、文字列enumはreverse mapping(rawValue→enum)ができません
(文字列の場合、生の値が重複する可能性があるから・・・?)。
実際に公式のドキュメントにも記述があります。(https://www.typescriptlang.org/docs/handbook/enums.html)
Keep in mind that string enum members do not get a reverse mapping generated at all.
仕組みがないなら作ってしまおうということで、ヘルパーメソッド的なものを自作してみました。v3.1.6で動作確認しています。
export function mapToEnum<T>(enumObject: T, value: any): T[keyof T] | undefined {
if (typeof enumObject === 'object') {
for (const key in enumObject) {
if (enumObject.hasOwnProperty(key) && enumObject[key] === value) {
return enumObject[key]
}
}
} else if (enumObject instanceof Array) {
return enumObject.find(value)
}
/* 3.0.x
} else if ((enumObject as any) instanceof Array) {
return (enumObject as any[]).find(value)
}
*/
}
////////////////////
enum Meta {
Hoge = 'hoge',
Fuga = 'fuga',
Foo = 'foo',
Bar = 'bar'
}
const meta: Meta = mapToEnum(Meta, 'hoge')
console.log(meta) // hoge
本当はenumに存在する文字列だけ受け取れるようにしたいところですが、それができなかったので戻り値でundefinedを許容するようにしました。