as const as const アサーション
最終更新:2026-10-22
as const as const アサーション
as const はリテラル全体を最深部まで「凍結」した定数型にします。すべてのプロパティが readonly になり、すべての値がリテラル型(文字列、数値、ブーリアン)へ絞り込まれ、配列は読み取り専用タプルになります。「定数表からユニオン型を自動導出する」という定番パターンの中核です。
| グループ | ナローイングとアサーション |
|---|---|
| 種類 | 演算子 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
const ROLES = ["admin", "editor", "viewer"] as const;
type Role = (typeof ROLES)[number]; // "admin" | "editor" | "viewer"
const THEME = { mode: "dark", fontSize: 14 } as const;
// { readonly mode: "dark"; readonly fontSize: 14 }
⚙️ パラメータ
| as const | リテラル式に作用し、デフォルトの広い型(string、number、可変配列)ではなく、最も狭い読み取り専用のリテラル型を推論します |
|---|
戻り値:実行時の効果はありません。トランスパイル後は as const が完全に消え、コンパイル時に推論された型が最も狭い読み取り専用版に置き換わるだけです。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
admin/editor/viewer
role set to editor
dark 14
(トランスパイル後の実行出力。setRole("editor") がチェックを通るのは、as const が Role をリテラルのユニオンにしているからです。as const がないと ROLES は string[] と推論され、setRole("editor") はコンパイルエラーになります)
💡 ポイント
ℹ️ 説明 as const は「深い」ものです。ネストしたオブジェクトのプロパティも同じく readonly になり、リテラルへ絞り込まれます。この点は(浅い)Readonly<T> とは異なります。
⚠️ 注意 as const の後はどのプロパティも変更できず、配列への push もコンパイル時にエラーになります。可変なコピーが必要なときはスプレッド構文で再構築しましょう。{ ...DEFAULT_THEME, mode: "light" } のように。
💡 ヒント 定番の組み合わせは (typeof CONST)[number] です。as const の配列をリテラルのユニオン型に変え、定数表を「単一の情報源(single source of truth)」にします。役割を1つ追加すれば、型が自動的に追従します。
🏷️ 関連ナローイングとアサーション
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q const 変数と as const の違いは何ですか?
A const は「変数を再代入できない」ことを保証するだけで、オブジェクトのプロパティは変わらず変更可能で、型推論も広いまま(string)です。as const は型そのものを読み取り専用のリテラルへナローイングます。const はバインディングを、as const は型をロックします。
Q as const の配列からユニオン型を導出するには?
A 2ステップです。typeof ARR で配列の型を取り、次にインデックスアクセス [number] で全要素型のユニオンを取ります。type Role = (typeof ROLES)[number] のように。公式が推奨するパターンで、2つのリストを手で管理する必要はありません。
Q すべてのオブジェクトリテラルに as const を付けるべきですか?
A 付けるべきではありません。向いているのは「真の定数」です。設定のスナップショット、列挙値の表、action type など。後から変更されるオブジェクトや可変な状態から埋められるオブジェクトには付けないでください。至る所で readonly のエラーに悩まされ、逆に大量のアサーションを書くはめになります。