functiondoSomething(x:number|string) {if (typeof x ==='string') { // Within the block TypeScript knows that `x` must be a stringconsole.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の例です:
classFoo { foo =123; common ='123';}classBar { bar =123; common ='123';}functiondoStuff(arg:Foo|Bar) {if (arg instanceofFoo) {console.log(arg.foo); // OKconsole.log(arg.bar); // Error! }if (arg instanceofBar) {console.log(arg.foo); // Error!console.log(arg.bar); // OK }console.log(arg.common); // OKconsole.log(arg.foo); // Error!console.log(arg.bar); // Error!}doStuff(newFoo());doStuff(newBar());
functionfoo(a?:number|null) {if (a ==null) return;// a is number now.}
ユーザー定義のType Guard
JavaScriptには非常に豊富な実行時の解析サポートが組み込まれていません。単純なJavaScriptオブジェクトだけを使用している場合(構造型を使用する場合)、 instanceofまたはtypeofにアクセスすることさえできません。これらの場合、Type Guard関数をユーザーが定義することができます。これは、someArgumentName is SomeTypeを返す関数です。次に例を示します。
/** * Just some interfaces */interfaceFoo { foo:number; common:string;}interfaceBar { bar:number; common:string;}/** * User Defined Type Guard! */functionisFoo(arg:any): arg isFoo {returnarg.foo !==undefined;}/** * Sample usage of the User Defined Type Guard */functiondoStuff(arg:Foo|Bar) {if (isFoo(arg)) {console.log(arg.foo); // OKconsole.log(arg.bar); // Error! }else {console.log(arg.foo); // Error!console.log(arg.bar); // OK }}doStuff({ foo:123, common:'123' });doStuff({ bar:123, common:'123' });