TypeScript enumの落とし穴 その2

TypeScript の enum の落とし穴その2です。

こちらはそんなに知られていないのと、あまりこの機能を利用されることはないと思うので重要度は低めです。

enum では逆引きができます。

enum MyEnum {
    Hoge,
    Foo,
    Bar
}

let a = MyEnum[0] //string aにはHogeが入る

上記のように書くと、enum のキー部分を取得できます。

Hogeの値は0なので、MyEnum[0]と書くと Hoge というキー名が取れるということです。

ここで注意が必要なのが、存在しない値を指定した場合にどうなるかということです。

enum MyEnum {
    Hoge,
    Foo,
    Bar
}

let a = MyEnum[0] //string aにはHogeが入る
a = MyEnum[3] //エラーにならない aにはundefinedが入る

存在しない値を指定した場合にはTypeScriptはエラーとせずに、undefinedを返します。

これは予想に反する動きではないでしょうか。

逆引き自体がそこまで使われないと思うので、const enum とすることで逆引きを防止できるのでおすすめです。

const enum MyEnum {
    Hoge,
    Foo,
    Bar
}

let a = MyEnum[0] // エラーになる A const enum member can only be accessed using a string literal.