Skip to content

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)は、対象の値が nullundefined である可能性をコンパイラから強制的に消し去る機能です(Non-null Assertion)。

  • 注意点: これも as と同様に型安全性を破壊する危険な機能です。万が一実行時に値が null だった場合、ランタイムエラーが発生します。
  • 対策: ! を使う前に、if 文による undefined チェックや、オプショナルチェイニング(?.)、Nullish Coalescing演算子(??)を用いて安全に実装できないかを第一に考えるべきです。

式 as const は、前述の危険な as とは異なり、プログラムの安全性を向上させるすばらしい機能です。型推論に対して以下の4つの強力な効果をもたらします。

  1. 配列のタプル化: 配列リテラルが、要素数不明の配列型ではなく、要素数が固定された「タプル型」に推論されます。
  2. 完全な読み取り専用: オブジェクトやタプルのすべてのプロパティが readonly になります。
  3. wideningの防止: 文字列や数値などのリテラルが、stringnumber に拡大(widening)されず、特定の値のみを許容する「リテラル型」のまま保持されます。
  4. テンプレートリテラル型化: テンプレート文字列リテラルが、純粋な string ではなくテンプレートリテラル型になります。