9.2 チェックの厳しさに関わるオプション
TypeScriptの型チェックの挙動や厳しさは、tsconfig.json のコンパイラオプションによってある程度制御することが可能です。
9.2.1 チェックをまとめて有効にできるstrictオプション
Section titled “9.2.1 チェックをまとめて有効にできるstrictオプション”現在のTypeScriptにおいて最も重要な設定が strict オプションです。
- 一括有効化:
strict: trueと設定するだけで、より厳格な型チェックを行う複数のオプション(strictNullChecksやnoImplicitAnyなど)をまとめて有効化できます。 - 後方互換性への配慮: これらの厳しいチェックがデフォルトで有効になっていないのは、古いTypeScriptコードがバージョンアップ時に突然コンパイルエラーになるのを防ぐ(後方互換性を保つ)ためです。
- 基本方針: 新規プロジェクトにおいては、後方互換性を気にする必要がないため、特別な事情がない限り必ず有効にすべき設定です。
9.2.2 strictNullChecks でnullとundefinedを安全に検査する
Section titled “9.2.2 strictNullChecks でnullとundefinedを安全に検査する”TypeScriptにおける「null安全性」を担保するための重要なオプションです。
- 無効時の危険性: このオプションをオフにすると、型システムから
nullやundefinedの概念が消え去り、string型などの変数にundefinedを代入できてしまうため、ランタイムエラーの温床となります。 - 有効化のメリット: 有効にすることで、値が存在しない可能性(オプショナルプロパティなど)をコンパイラが厳密に検知するようになります。非常に古いコードを保守する場合を除き、常に有効にしておくべきです。
9.2.3 型の書き忘れや推論の失敗を防ぐnoImplicitAnyオプション
Section titled “9.2.3 型の書き忘れや推論の失敗を防ぐnoImplicitAnyオプション”プログラマーが意図しない危険な any 型(暗黙のany)が発生するのを防ぐオプションです。
- 関数の引数: TypeScriptでは関数の引数の型注釈は原則必須ですが、このオプションが無効の場合、型を省略した引数は自動的に
any型として扱われてしまいます。 - 有効化のメリット: 有効にすると、暗黙の
anyが発生した箇所でimplicitly has an 'any' typeというコンパイルエラーを出してくれるため、型安全性の低下を未然に防ぐことができます。 - 無効にする唯一の例外: 既存のJavaScriptプログラムをTypeScriptに段階的に移行する初期段階においてのみ、エラーを減らすために無効化する戦略が取られることがあります。
9.2.4 インデックスアクセスを厳しくするnoUncheckedIndexedAccessオプション
Section titled “9.2.4 インデックスアクセスを厳しくするnoUncheckedIndexedAccessオプション”TypeScript 4.1で追加された、安全性を極限まで高めるための非常に厳しい(pedanticな)オプションです。デフォルトの strict: true には含まれていません。
- 挙動の変化: インデックスシグネチャ(
[key: string]: numberなど)や配列(arr[0]など)を通じたプロパティアクセスを行った際、得られる型が常にundefinedとのユニオン型(例:number | undefined)になります。 - 安全性: 存在しないプロパティや配列の範囲外アクセスによるランタイムエラーの危険性を、型システム上で防ぐことができます。
- 導入のタイミング: あとから有効にするのは困難なため、新規プロジェクトの立ち上げ時に有効にしておくことが推奨されます。
9.2.5 新規プロジェクトでのお勧め設定
Section titled “9.2.5 新規プロジェクトでのお勧め設定”プロジェクト開始後にコンパイラオプションを厳しくすると大量のエラーに対処する必要があるため、立ち上げ時に可能な限り厳しい設定にしておくことが重要です。
- 推奨設定リスト:
"strict": true(デフォルトで有効化すべき基本設定)"noUncheckedIndexedAccess": true(より安全な配列・オブジェクトアクセスのため)"exactOptionalPropertyTypes": true(オプショナルプロパティの曖昧さをなくすため)
- その他の推奨: 好みに応じて
noImplicitReturns、noFallthroughCasesInSwitch、noImplicitOverrideなどのオプションも有効にすると、さらにミスを防ぎやすくなります。