【TypeScript】Enumは非推奨
技術的なメモです。
結論
Enum
を使ってはダメ。
ざっくりとした理由
string enum
の特殊な構造
string enum
は構造的部分型でなく例外的に公称型を採用している。
型安全でない
単純な Enum
でなく拡大された型(e.g. number
型)となり定義外の値を参照できることがある。
そのほかに
パフォーマンスが悪いなど。
対策
ユニオンリテラル
const Kind = | 0 | 1 | 2
シンプルな記述だが、 Kind
型の絞り込みを行う場合にベタ書きになりやすい。
function showKind(k: kind) { if (k === 2) { // 定義値「2」の記述が散乱しやすく検索性に劣る ... } }
keyof typeof
戦略
const mammal = { human: "Human", alpaca: "Alpaca", elephant: "Elephant" } as const type Mammal = typeof mammal[keyof typeof mammal];
mammal
の値に安全にアクセスできる記法。
値を取り出すだけで大仰な記述だが、定数定義の記述変更に追従できるメリットが特に大きい。
注意
keyof typeof
戦略において、定数定義に as const
を付けないと Mammal
が string
型になる。