const colors = ["red", "green"] as const の as const は、何をしていますか。
型をリテラル型のまま固定し、配列やオブジェクトを readonly にします。string[] ではなく readonly ["red", "green"] になります。実行時に凍結するわけではありません。
面接官が見ているのはリテラル型と readonly への固定を理解しているか。
よくある答えと、面談でどう見られるか
- 値を変更できない readonly にし、型を string[] ではなく "red" と "green" のリテラル型に固定する
その通りです。型は readonly ["red", "green"] になります。 - 配列を実行時に凍結する(Object.freeze と同じ)
実行時には何もしません。型の上で書き換えを禁止するだけです。 - const で宣言しているので、as const は意味が無い
const は変数の再代入を止めるだけで、配列の中身の変更は止めません。型も string[] のままです。 - 型を any にする
逆です。もっとも狭い型に固定します。
模範解答
2つのことをします。1つ目は、型を広げずにリテラル型のまま固定することです。as const が無いと colors の型は string[] ですが、付けると readonly ["red", "green"] になります。2つ目は、配列やオブジェクトを readonly にして、書き換えを型の上で禁止することです。
ここから typeof colors[number] と書けば、"red" | "green" というユニオン型を作れます。値の一覧と型を1か所で管理できるので、enum の代わりによく使われます。
注意点は、どちらも型の上だけの話であることです。実行時に配列が凍結されるわけではありません。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。