strictモードの各オプション
| 対応: | TypeScript 2.3(2017) |
|---|
『strict: true』を tsconfig.json に設定すると、複数の厳格な型チェックフラグが一括で有効になります。各フラグは個別にも設定できます。新規プロジェクトでは最初から有効にすることが推奨されます。
構文
// tsconfig.json
{
"compilerOptions": {
"strict": true // 以下のフラグをすべて有効にする
}
}
strict が有効にするフラグ一覧
| フラグ | 概要 |
|---|---|
| strictNullChecks | null・undefined を他の型に代入できなくする。最も重要なフラグ。 |
| noImplicitAny | 型が推論できず暗黙的に any になる場合にエラーを出す。 |
| strictFunctionTypes | 関数型の引数について反変チェックを厳格に行う。 |
| strictBindCallApply | bind・call・apply の引数型を厳格にチェックする。 |
| strictPropertyInitialization | クラスのプロパティがコンストラクタで初期化されていない場合にエラーを出す。『!(definite assignment assertion)』は、変数が必ず初期化されていることを開発者が保証するための記法です。 |
| noImplicitThis | this が暗黙的に any になる場合にエラーを出す。 |
| alwaysStrict | 出力する JS ファイルの先頭に "use strict" を追加する。 |
| useUnknownInCatchVariables | catch の変数を any ではなく unknown として扱う(TypeScript 4.4+)。 |
サンプルコード
// strictNullChecks: 有効時
let name: string = null; // エラー: null は string に代入できない
let maybeName: string | null = null; // OK
// noImplicitAny: 有効時
function greet(name) { // エラー: name は暗黙的に any になる
return name.toUpperCase();
}
function greet(name: string) { // OK
return name.toUpperCase();
}
// strictPropertyInitialization: 有効時
class User {
name: string; // エラー: コンストラクタで初期化されていない
age!: number; // ! を付けると初期化チェックを無効にできる(definite assignment assertion)
email: string;
constructor(email: string) {
this.email = email;
// name が初期化されていないためエラー
}
}
// useUnknownInCatchVariables: 有効時
try {
JSON.parse('{invalid}');
} catch (err) {
// err は unknown 型(any ではない)
if (err instanceof Error) {
console.log(err.message); // OK
}
}
// strictFunctionTypes: コールバックの型チェック
type Handler = (event: MouseEvent) => void;
const fn: Handler = (event: Event) => {}; // エラー: Event は MouseEvent より広い
概要
これらのフラグの中で最も影響が大きいのは『strictNullChecks』です。これを有効にすると、null・undefined を扱うすべての箇所で明示的なチェックが必要になります。既存の JavaScript コードを TypeScript に移行する際にエラーが多発する原因の多くはこのフラグによるものです。
既存プロジェクトに後から『strict』を適用する場合は、個別フラグを一つずつ有効にしながら段階的に対応するのが現実的です。まず『noImplicitAny』を有効にして型のあいまいさをなくし、次に『strictNullChecks』で null 安全性を確保するという順番が一般的です。
『strict: true』に加えて、よく使われる追加フラグとして『noUncheckedIndexedAccess』(配列アクセスの結果を T | undefined にする)や、override の必須化に使う『noImplicitOverride』があります。詳細は tsconfig.json 主要オプション を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。