型ガード
Type Guardを使用すると、条件ブロック内のオブジェクトの型を制限することができます。
typeof
TypeScriptはJavaScriptのinstanceofとtypeof演算子の使用を認識しています。条件付きブロックでこれらを使用すると、TypeScriptはその条件ブロック内で異なる変数の型を理解します。ここでは、TypeScriptが特定の関数がstringに存在せず、おそらくユーザーのタイプミスであったことを指摘する簡単な例を示します:
function doSomething(x: number | string) {
if (typeof x === 'string') { // Within the block TypeScript knows that `x` must be a string
console.log(x.subtr(1)); // Error, 'subtr' does not exist on `string`
console.log(x.substr(1)); // OK
}
x.substr(1); // Error: There is no guarantee that `x` is a `string`
}instanceof
次はクラスと instanceofの例です:
class Foo {
foo = 123;
common = '123';
}
class Bar {
bar = 123;
common = '123';
}
function doStuff(arg: Foo | Bar) {
if (arg instanceof Foo) {
console.log(arg.foo); // OK
console.log(arg.bar); // Error!
}
if (arg instanceof Bar) {
console.log(arg.foo); // Error!
console.log(arg.bar); // OK
}
console.log(arg.common); // OK
console.log(arg.foo); // Error!
console.log(arg.bar); // Error!
}
doStuff(new Foo());
doStuff(new Bar());TypeScriptは elseを理解しています。そうすればifの中は、特定の型であり、elseの中はその型でないことが分かります。次に例を示します。
in
in演算子は、オブジェクト上のプロパティの存在を安全にチェックし、Type Guardとして使用することができます。例えば。
リテラル型のType Guard
異なるリテラル値を区別するには、=== / == / !== / != が利用できます。
ユニオン型の中にリテラル型がある場合にも同じ方法が使えます。次のように共通するプロパティの値をチェックすることで、異なるユニオン型を区別できます。
strictNullChecksを使用したnullとundefinedのチェック
strictNullChecksを使用したnullとundefinedのチェックTypeScriptは十分賢いので、次のように== null / != nullチェックをすることでnullとundefinedの両方を排除できます。
ユーザー定義のType Guard
JavaScriptには非常に豊富な実行時の解析サポートが組み込まれていません。単純なJavaScriptオブジェクトだけを使用している場合(構造型を使用する場合)、 instanceofまたはtypeofにアクセスすることさえできません。これらの場合、Type Guard関数をユーザーが定義することができます。これは、someArgumentName is SomeTypeを返す関数です。次に例を示します。
Type Guardsとコールバック
TypeScriptは、コールバック内でタイプガードがアクティブのままであることと仮定することは危険なため、そのような仮定はしません。例えば以下のようになります:
これを修正するには推測された安全な値をローカル変数に格納するのみでよく、その値が外部から変更されないと自動的に保障できます。TypeScript はそれを簡単に理解することができます。
最終更新
役に立ちましたか?