strictNullChecks
strictNullChecks
はnull
やundefined
のチェックを厳しくするコンパイラオプションです。
- デフォルト: strictが有効の場合は
true
、それ以外はfalse
- 追加されたバージョン: 2.0
- TypeScript公式が有効化推奨
null
とundefined
が代入できる危険性
TypeScriptではstrictNullChecks
がfalse
の場合、null
とundefined
の代入がチェックされません。非null型や非undefined型の変数にも、null
とundefined
が代入できます。
strictNullChecksがfalseの場合ts
constdate :Date = null; // OKconsterror :Error =undefined ; // OK
strictNullChecksがfalseの場合ts
constdate :Date = null; // OKconsterror :Error =undefined ; // OK
null
やundefined
にはプロパティが存在しません。そのため、JavaScript実行時にエラーになります。
ts
date .getDay ();
ts
date .getDay ();
strictNullChecks
がtrue
の場合、非null型へのnull
の代入、非undefined型へのundefined
の代入それぞれがコンパイルエラーになります。
strictNullChecksがtrueの場合ts
constType 'null' is not assignable to type 'Date'.2322Type 'null' is not assignable to type 'Date'.: date Date = null;constType 'undefined' is not assignable to type 'Error'.2322Type 'undefined' is not assignable to type 'Error'.: error Error =undefined ;
strictNullChecksがtrueの場合ts
constType 'null' is not assignable to type 'Date'.2322Type 'null' is not assignable to type 'Date'.: date Date = null;constType 'undefined' is not assignable to type 'Error'.2322Type 'undefined' is not assignable to type 'Error'.: error Error =undefined ;
関数の戻り値の型への影響
strictNullChecks
の設定によって、関数の戻り値の型が変わることがあります。配列のfind
メソッドの戻り値の型は、要素の型もしくはundefined
です。しかし、strictNullChecks
がfalse
の場合、戻り値がundefined
になる可能性をコンパイラが考えなくなります。戻り値にnull
が入る可能性がある関数、たとえばgetElementById
の場合も同様です。
strictNullChecksがfalseの場合ts
constresult = [1, 2, 3].find ((x ) =>x == 1);constelement =document .getElementById ("main");
strictNullChecksがfalseの場合ts
constresult = [1, 2, 3].find ((x ) =>x == 1);constelement =document .getElementById ("main");
strictNullChecks
がtrue
の場合は、undefined
やnull
が戻り値になる可能性をコンパイラが考慮します。そのため、find
なら要素の型とundefined
のユニオン型に、getElementById
ならHTMLElement | null
になります。
strictNullChecksがtrueの場合ts
constresult = [1, 2, 3].find ((x ) =>x == 1);constelement =document .getElementById ("main");
strictNullChecksがtrueの場合ts
constresult = [1, 2, 3].find ((x ) =>x == 1);constelement =document .getElementById ("main");
この設定の効果は、ユーザー定義の型ガード関数にも及びます。たとえば、関数の戻り値をstring | undefined
と型注釈したとしても、strictNullChecks
がfalse
の場合はstring
型になります。
strictNullChecksがfalseの場合ts
// ユーザー定義の型ガード関数functiongetStringOrUndefined (): string | undefined {returnundefined ;}constvalue =getStringOrUndefined ();
strictNullChecksがfalseの場合ts
// ユーザー定義の型ガード関数functiongetStringOrUndefined (): string | undefined {returnundefined ;}constvalue =getStringOrUndefined ();
strictNullChecks
は有効にしよう
null
やundefined
を期待しない変数にそれらが代入できるのは危険です。また、関数の戻り値にnull
やundefined
が入る可能性が見えなくなることも、思わぬバグを生む原因になります。strictNullChecks
はtrue
を設定するのがお勧めです。
学びをシェアする
😱TypeScriptデフォルトでnullとundefinedの代入チェックをしない(どんな型にも代入できる)
✅コンパイラオプションstrictNullChecksをtrueにすると、nullとundefinedの代入がチェックされる
👍strictNullChecksは有効にしよう
『サバイバルTypeScript』より
関連情報
📄️ strict
strict系のオプションを一括で有効化する
📄️ null型
JavaScriptのnullは値がないことを示す値です。
📄️ undefined型
JavaScriptのundefinedは未定義を表すプリミティブな値です。変数に値がセットされていないとき、戻り値が無い関数、オブジェクトに存在しないプロパティにアクセスしたとき、配列に存在しないインデックスでアクセスしたときなどに現れます。