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 のエラーに悩まされ、逆に大量のアサーションを書くはめになります。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%