TypeScript enumの逆引きの落とし穴

TypeScriptのenumは落とし穴がいくつかあり、利用することを控えた方が良いとされていますが、今回は逆引きについてです。

例です。

enum MyEnum {
  'Hoge',
  'Foo',
  'Bar'
}

let a = MyEnum.Hoge // MyEnum
let b = MyEnum[1] // 逆引き bはstringと推論される
let c = MyEnum[3] // 逆引き 存在しないはずなのにコンパイルエラーにならない

console.log(b) // 'Foo'
console.log(c) // undefined になる

問題はMyEnum[3]です。

MyEnum[3]は存在しないにもかかわらずコンパイルエラーにはなりません。

そして、JavaScriptの実行結果は undefined になります。

存在しないindexで逆引きをしている場合は、コンパイルエラーになるのが自然に思えます。

なぜなら、存在しないindexを指定してundefinedを得ようと思うケースがほぼないからです。