TypeScript
ユーザー定義型警備員
サーチ…
構文
- 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
は、 number
、 string
、 boolean
、およびsymbol
を区別する必要がある場合に使用されます。他の文字列定数はエラーにはなりませんが、型の絞り込みには使用されません。
instanceof
とは異なり、 typeof
は任意の型の変数で動作します。以下の例では、 foo
はnumber | 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);
}
}