サーチ…


構文

  • typeof x === "タイプ名"
  • x instanceof TypeName
  • function(foo:any):fooはTypeNameです。{/ *ブール値を返すコード* /}

備考

TypeScriptの型アノテーションを使用すると、コードで扱える可能性のある型が制約されますが、変数の実行時の型に基づいて異なるコードパスを取る必要があるのが一般的です。

型ガードは、型の厳密さとキャスト(型アサーションとも呼ばれます)を避けながら、変数の実行時の型に基づいて弁別するコードを書くことを可能にします。

instanceofの使用

instanceofでは、変数の型がanyである必要があります。

このコード( 試してみてください ):

class Pet { }
class Dog extends Pet {
    bark() {
        console.log("woof");
    }
}
class Cat extends Pet {
    purr() {
        console.log("meow");
    }
}

function example(foo: any) {
    if (foo instanceof Dog) {
        // foo is type Dog in this block
        foo.bark();
    }

    if (foo instanceof Cat) {
        // foo is type Cat in this block
        foo.purr();
    }
}

example(new Dog());
example(new Cat());

プリント

woof
meom

コンソールに接続します。

typeofの使用

typeofは、 numberstringboolean 、およびsymbolを区別する必要がある場合に使用されます。他の文字列定数はエラーにはなりませんが、型の絞り込みには使用されません。

instanceofとは異なり、 typeofは任意の型の変数で動作します。以下の例では、 foonumber | string問題のないnumber | string

このコード( 試してみてください ):

function example(foo: any) {
    if (typeof foo === "number") {
        // foo is type number in this block
        console.log(foo + 100);
    }

    if (typeof foo === "string") {
        // fooi is type string in this block
        console.log("not a number: " + foo);
    }
}

example(23);
example("foo");

プリント

123
not a number: foo

タイプガード機能

任意のロジックを使用して型ガードとして機能する関数を宣言することができます。

彼らは次の形式をとります:

function functionName(variableName: any): variableName is DesiredType {
    // body that returns boolean
}

関数がtrueを返すと、TypeScriptはその関数の呼び出しによって保護されるブロック内の型をDesiredTypeに絞り込みます。

例えば( 試してみてください ):

function isString(test: any): test is string {
    return typeof test === "string";
}

function example(foo: any) {
    if (isString(foo)) {
        // foo is type as a string in this block
        console.log("it's a string: " + foo);
    } else {
        // foo is type any in this block
        console.log("don't know what this is! [" + foo + "]");
    }
}

example("hello world");          // prints "it's a string: hello world"
example({ something: "else" });  // prints "don't know what this is! [[object Object]]"

ガードの関数型述語( foo is Bar関数の戻り型の位置にfoo is Bar )は、コンパイル時に型を狭めるために使用され、関数本体は実行時に使用されます。述語と関数の型が一致していなければ、コードが機能しません。

型ガード関数はtypeofまたはinstanceofを使用する必要はなく、より複雑なロジックを使用できます。

たとえば、このコードでは、バージョン文字列をチェックしてjQueryオブジェクトがあるかどうかを判断します。

function isJQuery(foo): foo is JQuery {
    // test for jQuery's version string
    return foo.jquery !== undefined;
}

function example(foo) {
    if (isJQuery(foo)) {
        // foo is typed JQuery here
        foo.eq(0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow