【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 を付けないと Mammalstring 型になる。