strictNullChecks
デフォルトでは、nullundefinedはTypeScriptのすべての型に代入できます。
1
let foo: number = 123;
2
foo = null; // Okay
3
foo = undefined; // Okay
Copied!
これは、多くの人々がどのようにJavaScriptを書くかをモデルにしています。しかし、すべてのものと同様に、TypeScriptでは、nullundefinedを代入できるか、できないかを明示することができます。
厳密なnullチェックモードでは、nullundefinedは異なります:
1
let foo = undefined;
2
foo = null; // NOT Okay
Copied!
Memberインターフェースを持っているとしましょう:
1
interface Member {
2
name: string,
3
age?: number
4
}
Copied!
すべてのMemberが彼らの年齢を提供するわけではないので、ageはオプションのプロパティです。 ageの値はundefinedかもしれません。
undefinedはすべての悪の根です。ランタイムエラーが発生することがよくあります。実行時にErrorをスローするコードを書くのは簡単です:
1
getMember()
2
.then(member: Member => {
3
const stringifyAge = member.age.toString() // Cannot read property 'toString' of undefined
4
})
Copied!
しかし、厳密なnullチェックモードでは、このエラーはコンパイル時に捕捉されます。
1
getMember()
2
.then(member: Member => {
3
const stringifyAge = member.age.toString() // Object is possibly 'undefined'
4
})
Copied!

非nullアサーション演算子(Non-Null Assertion Operator)

新しい!ポストフィックス式演算子を使用して、型チェッカーが結論付けられないコンテキストにおいて、そのオペランドが非nullでかつ非undefinedであることをアサートすることができます。例えば:
1
// Compiled with --strictNullChecks
2
function validateEntity(e?: Entity) {
3
// Throw exception if e is null or invalid entity
4
}
5
6
function processEntity(e?: Entity) {
7
validateEntity(e);
8
let a = e.name; // TS ERROR: e may be null.
9
let b = e!.name; // OKAY. We are asserting that e is non-null.
10
}
Copied!
これは単なるアサーションであり、型アサーションと同じように、あなたは値がnullでないことを確認する責任があることに注意してください。非nullアサーションは、本質的にはコンパイラに"それはnullでないことが分かっているから、nullではないものとして使います"と伝えるものです。

Definite Assignment Assertion演算子(Definite Assignment Assertion Operator)

TypeScriptは、初期化されていないクラスのプロパティについてもエラーを出します。
1
class C {
2
foo: number; // OKAY as assigned in constructor
3
bar: string = "hello"; // OKAY as has property initializer
4
baz: boolean; // TS ERROR: Property 'baz' has no initializer and is not assigned directly in the constructor.
5
constructor() {
6
this.foo = 42;
7
}
8
}
Copied!
プロパティ名に後置された完全な代入アサーションを使用して、コンストラクタ以外の場所で初期化することをTypeScriptに通知することができます。
1
class C {
2
foo!: number;
3
// ^
4
// Notice this exclamation point!
5
// This is the "definite assignment assertion" modifier.
6
7
constructor() {
8
this.initialize();
9
}
10
initialize() {
11
this.foo = 0;
12
}
13
}
Copied!
単純な変数宣言でこのアサーションを使用することもできます(例:
1
let a: number[]; // No assertion
2
let b!: number[]; // Assert
3
4
initialize();
5
6
a.push(4); // TS ERROR: variable used before assignment
7
b.push(4); // OKAY: because of the assertion
8
9
function initialize() {
10
a = [0, 1, 2, 3];
11
b = [0, 1, 2, 3];
12
}
Copied!
すべてのアサーションと同様に、コンパイラにあなたを信頼するように指示しています。コンパイラは、コードが実際にプロパティを常に割り当てていなくても、エラーを出すことはありません。
最終更新 1yr ago