TypeScriptのenumはconstアサーションで代用すべき

1 min read読了の目安(約500字

enumのアンチパターン1

enumは全ての数値が割り当て可能なため、実行するまでエラーかどうか分からない。

enum Color {
  RED,
  BLUE,
  GREEN
}

Color[12] // undefined(型チェッカーでは、エラー扱いとはならない)

enumのアンチパターン2

enumの中に1つでも数値があれば、enum全体が安全でなくなる。

enum Color {
  RED = 'RED',
  BLUE = 'BLUE',
  GREEN = 1
}

Color[12] // undefined(型チェッカーでは、エラー扱いとはならない)

constアサーションで解決

enumを安全に使用するには、チーム内で厳密なルールが必要。
であるならば、初めから使用は避けて代用となるconstアサーションを使用する。

const Color = {
  RED: 'RED',
  BLUE: 'BLUE',
  GREEN: 'GREEN'
} as const

Color[12] // コンパイルエラー
type Color = keyof typeof Color // "RED" | "BLUE" | "GREEN"