メインコンテンツまでスキップ

strictPropertyInitialization

strictPropertyInitializationはクラスプロパティの初期化を必須にするコンパイラオプションです。

  • デフォルト: strictが有効の場合はtrue、それ以外はfalse
  • 追加されたバージョン: 2.7
  • TypeScript公式が有効化推奨
caution

このオプションを効かすにはstrictNullCheckstrueする必要があります。

解説

strictPropertyInitializationtrueにすると、値が初期化されていないクラスプロパティについて警告を出します。

ts
class Foo {
prop: number;
Property 'prop' has no initializer and is not definitely assigned in the constructor.2564Property 'prop' has no initializer and is not definitely assigned in the constructor.
}
ts
class Foo {
prop: number;
Property 'prop' has no initializer and is not definitely assigned in the constructor.2564Property 'prop' has no initializer and is not definitely assigned in the constructor.
}

初期化は、次のいずれかで行う必要があります。

  1. コンストラクタで初期化
  2. 初期化子で初期化
  3. undefinedとのユニオン型で型注釈する

次は、コンストラクタで初期化する例です。

ts
class Foo {
prop: number;
 
constructor() {
this.prop = 1;
}
}
ts
class Foo {
prop: number;
 
constructor() {
this.prop = 1;
}
}

次は、初期化子で初期化する例です。

ts
class Foo {
prop: number = 1;
// ^^^初期化子
}
ts
class Foo {
prop: number = 1;
// ^^^初期化子
}

プロパティの型がundefinedとのユニオン型の場合、初期化しなくても警告が出ません。

ts
class Foo {
prop: number | undefined;
}
ts
class Foo {
prop: number | undefined;
}

プロパティがオプションの場合も警告が出ません。

ts
class Foo {
prop?: number;
}
ts
class Foo {
prop?: number;
}
学びをシェアする

TypeScriptのstrictPropertyInitializationはプロパティの初期化を必須にするコンパイラオプション。

⚠️strictNullChecksもtrueする必要あり
✅コンストラクタで初期化OR初期化子が必須になる
🙆🏻‍♂️undefinedとのユニオン型で型注釈するのはOK

『サバイバルTypeScript』より

この内容をツイートする

関連情報

📄️ strict

strict系のオプションを一括で有効化する

📄️ フィールド

JavaScriptでインスタンスにフィールドを持たせるには、インスタンス化したオブジェクトのプロパティに値を代入します。
  • 質問する ─ 読んでも分からなかったこと、TypeScriptで分からないこと、お気軽にGitHubまで🙂
  • 問題を報告する ─ 文章やサンプルコードなどの誤植はお知らせください。