次のコードのうち、型アサーションを使っているのはどれですか?
// A
const name = 'Alice';
// B
const age: number = 25;
// C
const data = JSON.parse(json) as User;
// D
function greet(user: User) { return user.name; }
解説
正解は C です。as User の部分が型アサーションで、「この値は User 型として扱ってほしい」とコンパイラに伝えています。A はコードに型を書いていませんが、TypeScript が右辺の 'Alice' から自動的に string 型だと判断する型推論です。B と D は変数や引数に : 型名 の形で明示的に型を書く型注釈です。この3つは似て見えますが、役割も安全性もまったく違います。3つの違いを一言でまとめると型推論: TypeScriptが文脈から型を自動で決める。開発者は何も書かない型注釈: 開発者が「この変数はこの型だ」と宣言する。値との整合性はコンパイラがチェックする型アサーション: 開発者が「コンパイラより自分の方がこの値の型を知っている」と上書き宣言する。コンパイラのチェックをすり抜ける型注釈と型アサーションはどこが決定的に違うのか似ているようで、安全性が真逆です。型注釈はコンパイラに検査してもらうのに対し、型アサーションはコンパイラの検査を黙らせる動きをします。// 型注釈: 値と型が合わないのでエラーになる
const n: number = 'hello'; // Error
// 型アサーション: エラーにならず通ってしまう
const n = 'hello' as unknown as number; // OK(でも中身は文字列)つまり型注釈は安全網として機能しますが、型アサーションは開発者が責任を負う代わりに検査をスキップする機能です。どれを優先して使うべきかプロのコードを読むと、基本は型推論に任せ、必要なところだけ型注釈を付けるスタイルが多いです。特に関数の引数と戻り値には型注釈を明示しておくと、インターフェースが固定されて読みやすくなります。型アサーションは「JSON.parseの結果」「DOM要素の具体型取得」など、TypeScriptが本当に知り得ない場面の最後の手段と考えてください。エラーを消したいがために安易に as を使うと、実行時にクラッシュする地雷を仕込むことになります。