IT-Q

const Color = { Red: "red", Green: "green" } as const から、"red" | "green" という型を作るには、どう書きますか。

(typeof Color)[keyof typeof Color] と書くと、値のリテラル型のユニオンになります。as const で値がリテラル型のまま残るのが前提です。enum を置き換えるときの定番の形です。

面接官が見ているのはtypeof と keyof を組み合わせて値から型を導けるか。

これは「参画先で、TypeScript をビルドせず Node.js で直接(型を取り除いて)動かす方針になりました。enum が多用されています。どうしますか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • (typeof Color)[keyof typeof Color]
    その通りです。値を1か所に書けば、型も一緒に変わります。
  • keyof typeof Color
    それはキーのユニオン("Red" | "Green")です。値のユニオンが欲しいなら、もう一段要ります。
  • typeof Color
    それはオブジェクト全体の型です。値のユニオンにはなりません。
  • 型は別に "red" | "green" と手で書く
    動きますが、値と型を2か所に書くことになり、いずれずれます。値から導きます。

模範解答

(typeof Color)[keyof typeof Color] と書きます。

typeof Color でオブジェクトの型を取り、keyof でキーのユニオン("Red" | "Green")を取り、それでインデックスアクセスすると、値の型のユニオン("red" | "green")になります。as const が付いているので、値の型は string ではなくリテラル型のまま残っています。

こうしておけば、色を足すときはオブジェクトに1行足すだけで、型も自動で変わります。enum を置き換えるときの定番の形です。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。