6.5 asによる型アサーション
型アサーションは、TypeScriptが保証してくれる型安全性を意図的に破壊(上書き)する機能です。TypeScriptの型推論や絞り込みが完璧ではない場面を補うための「エスケープハッチ」として存在しますが、使用は極力避けるべきです。
6.5.1 型アサーションを用いて式の型をごまかす
Section titled “6.5.1 型アサーションを用いて式の型をごまかす”式 as 型 という構文を用いることで、コンパイラが認識する「型」を強制的に変更することができます。
- 危険性: 型アサーションはコンパイラへの命令に過ぎず、実際の「値(ランタイムのデータ)」は何も変化しません。たとえば、数値に対して
as stringを適用してしまうと、存在しない文字列メソッドを呼び出そうとしてランタイムエラー(クラッシュ)を引き起こします。 - 正しい使いどころ: TypeScriptコンパイラが型の絞り込みを正しく行えない複雑なロジック(例: 配列の全要素を
everyメソッドで検査した後など)において、プログラマーが「絶対にこの型である」と保証できる場合にのみ使用します。 - ベストプラクティス:
asを使う場合は、なぜそれが安全なのかコメントを残すことが推奨されます。また、可能であればユーザー定義型ガードなど、より意図が明確な手段で代替できないか検討しましょう。
コラム28 型アサーションの古い記法
Section titled “コラム28 型アサーションの古い記法”以前は <型>式 という記法(例: <string>value)も存在していましたが、現在は非推奨です。Reactなどで使われるJSXの構文(タグ)と衝突してしまうため、モダンなTypeScript開発では常に as 構文を使用します。
コラム29 !を用いてnullとundefinedを無視する
Section titled “コラム29 !を用いてnullとundefinedを無視する”式の後ろに ! を付ける構文(例: value!.name)は、対象の値が null や undefined である可能性をコンパイラから強制的に消し去る機能です(Non-null Assertion)。
- 注意点: これも
asと同様に型安全性を破壊する危険な機能です。万が一実行時に値がnullだった場合、ランタイムエラーが発生します。 - 対策:
!を使う前に、if文によるundefinedチェックや、オプショナルチェイニング(?.)、Nullish Coalescing演算子(??)を用いて安全に実装できないかを第一に考えるべきです。
6.5.2 as constの用法
Section titled “6.5.2 as constの用法”式 as const は、前述の危険な as とは異なり、プログラムの安全性を向上させるすばらしい機能です。型推論に対して以下の4つの強力な効果をもたらします。
- 配列のタプル化: 配列リテラルが、要素数不明の配列型ではなく、要素数が固定された「タプル型」に推論されます。
- 完全な読み取り専用: オブジェクトやタプルのすべてのプロパティが
readonlyになります。 - wideningの防止: 文字列や数値などのリテラルが、
stringやnumberに拡大(widening)されず、特定の値のみを許容する「リテラル型」のまま保持されます。 - テンプレートリテラル型化: テンプレート文字列リテラルが、純粋な
stringではなくテンプレートリテラル型になります。