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』より