as 型アサーション(二重アサーションを含む)
最終更新:2026-10-22
as 型アサーション(二重アサーションを含む)
型アサーション(as)はコンパイラに対して「私は君より詳しい。これを T として扱え」と伝えるものです。実行時の値を変えず変換も行わず、コンパイラの推論を上書きするだけです。コンパイラが得られない情報を自分が持っている場合(DOM クエリ、サードパーティが返す unknown など)に使えますが、間違ってもコンパイラは止めません。
| グループ | ナローイングとアサーション |
|---|---|
| 種類 | 演算子 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
const el = document.getElementById("root") as HTMLElement;
const data = JSON.parse(raw) as Config; // よくある用法:unknown/any を具体的な型へまとめる
// 2つの型に重なりがまったくない場合は二重アサーションが必要(危険信号)
const n = value as unknown as Config;
⚙️ パラメータ
| as T | 式を T にアサーションします。TS は「重なりのある」型間(片方が他方に代入可能)でのみアサーションを許し、それ以外はエラーになります |
|---|---|
| as unknown as T | 二重アサーションです。まず unknown に変えてから T に変え、重なりチェックを迂回します。ほぼ常に型モデリングの問題を意味します |
戻り値:アサーションは実行時コードを一切生成しません。トランスパイル後は as を書かなかった場合と完全に同じで、コンパイル時の型の見え方だけが変わります。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
20 dark
string
(トランスパイル後の実行出力。2行目に注目してください。{w:number} にアサーションしても実行時の値は依然として文字列 "1920x1080" です。アサーションは値を変えず、typeof legacy は "string" のままです。間違ったアサーションは実行時になって初めて露見します)
💡 ポイント
⚠️ 注意 アサーションは型変換ではなく、実行時には何も起こりません。string を数値型にアサーションして toFixed を呼ぶと、コンパイルは通るが実行時にエラーになります。アサーションの誤りはすべて実行時に先送りされます。
ℹ️ 説明 TS 4.9 から as は強化されました。satisfies 演算子は「リテラル推論を保ちながら」型を検証でき、以前は as が必須だった多くの場面を、より安全な satisfies に置き換えられます。
💡 ヒント 優先順位は、型ガードによるナローイング > unknown + ナローイング > as アサーション > as unknown as です。アサーションは自分が本当にコンパイラより多くの情報を持つ場面に残し、二重アサーションが出たらまず設計を疑いましょう。
🏷️ 関連ナローイングとアサーション
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q 「まったく関係のない」2つの型を直接 as できないのはなぜですか?
A TS はアサーションの双方に「どちらかの方向の代入可能性」(重なり)を要求し、string を number にアサーションするような明らかな誤りを防いでいます。本当に必要な場合は as unknown as T を通ります。この儀式の存在自体が、立ち止まって本当にそうすべきか考えるためのものです。
Q as と型注釈(: T)の違いは何ですか?
A 注釈は「制約と検査」です。値が本当に T を満たす必要があり、満たさなければエラーになります。as は「検査の迂回」で、宣言だけで T だと主張します。注釈が使えるなら as は避けるべきです。注釈はコンパイラの保護を残し、as は自分で責任を負う行為です。
Q JSX ファイルでは <T>expr と as のどちらを使うべきですか?
A .tsx ファイルでは <T>expr のような山括弧アサーションは JSX 構文と衝突して使えず、expr as T に統一しましょう。どちらの書き方も意味的には完全に等価です。