【TypeScript】定数から型を作る

技術的なメモです。


モチベーション

次のような定数定義があるとします。

const RGB = {
  red: "Red",
  green: "Green",
  blue: "Blue"
}

このとき、定数 RGB

  • キーをキーに持つ型を作る
  • 値をキーに持つ型を作る

ことを考えます。
例えば、定数 RGB の構造を利用して「RGB値」の型を定義したいなどの状況です。

これが可能であるなら、次のようなメリットがあります。

  • RGB の定義変更に応じて作成した型が追従される
  • 定数から型を安全に作成できるため、定数を作成しようとする意識が自然に芽生える

キーをキーにもつ

type kRGB = Record<RGB, number>

TypeScript組み込みの Record 型を使います。
これによりキーを参照しながら number 型を値に持つ型を作成できます。

値をキーに持つ

type vRGB = Record<typeof RGB[keyof typeof RGB], number>

オブジェクトの値に安全にアクセスする手法として obj[keyof typeof obj] があります。これを利用しています。

注意事項

値をキーに持つ場合において、定数定義に as const を指定する必要があります。
はじめに記載したままでは単なるインデックスシグニチャになります。