言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

TypeScript辞典

  1. トップページ
  2. TypeScript辞典
  3. strictモードの各オプション

strictモードの各オプション

対応: TypeScript 2.3(2017)

『strict: true』を tsconfig.json に設定すると、複数の厳格な型チェックフラグが一括で有効になります。各フラグは個別にも設定できます。新規プロジェクトでは最初から有効にすることが推奨されます。

構文

// tsconfig.json
{
  "compilerOptions": {
    "strict": true // 以下のフラグをすべて有効にする
  }
}

strict が有効にするフラグ一覧

フラグ概要
strictNullChecksnull・undefined を他の型に代入できなくする。最も重要なフラグ。
noImplicitAny型が推論できず暗黙的に any になる場合にエラーを出す。
strictFunctionTypes関数型の引数について反変チェックを厳格に行う。
strictBindCallApplybind・call・apply の引数型を厳格にチェックする。
strictPropertyInitializationクラスのプロパティがコンストラクタで初期化されていない場合にエラーを出す。『!(definite assignment assertion)』は、変数が必ず初期化されていることを開発者が保証するための記法です。
noImplicitThisthis が暗黙的に any になる場合にエラーを出す。
alwaysStrict出力する JS ファイルの先頭に "use strict" を追加する。
useUnknownInCatchVariablescatch の変数を 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 主要オプション を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。