TypeScript enumの落とし穴 その1

TypeScriptのenumは安全に使用するにあたっていくつかの落とし穴があります。

今回はenumへの数値の割当のご紹介です。

const enum MyEnum {
    Hoge,
    Foo,
    Bar
}

let a = MyEnum.Hoge // aはMyEnum
a = MyEnum.Bar // OK
a = 100 // これがエラーにならない

上記のように一番下の100を変数に割り当ててもエラーになりません。

これを防ぐには、enumに文字列を指定します。

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

let a = MyEnum.Hoge // aはMyEnum
a = MyEnum.Bar // OK
a = 100 // エラーになってくれる

一つでも数値があると、数値を割り当てられるようになってしまうので注意が必要です。

const enum MyEnum {
    Hoge = 'Hoge',
    Foo = 1, //数値がひとつでもあると、、、
    Bar = 'Bar'
}

let a = MyEnum.Hoge // aはMyEnum
a = MyEnum.Bar // OK
a = 100 // これがエラーにならない。(数値が割当可能になってしまう)