2017-05-23 13 views
2

instanceofを使用して、オブジェクトが特定のタイプであるかどうかを確認しています。 これが本当であれば、そのオブジェクトをそのまま使用するには、そのオブジェクトをその特定の型にキャストする必要があると思います。instanceofを使用している場合は、typescriptにキャストは不要ですか?

代わりに、IF文の中で、キャストは必要ないようです。少なくともVisual StudioコードとTypescript Playgroundではありません。

class Drink { 
    price: number = 4; 
} 

class Beer extends Drink { 
    alcohol: number = 6; 
} 

let array: Array<Drink> = new Array<Drink>(); 
array.push(new Drink(), new Beer(), new Drink()); 

for (let g of array) { 
    // here, only 'price' is available as a property of drink 
    console.log(g.price); 
    if (g instanceof Beer) {  
     // but unexpectedly, inside the IF statement 
     // the alcohol value IS available! 
     console.log(g.alcohol); 

     // I expected I needed to cast drink to beer first: 
     console.log((<Beer>g).alcohol); 
    } 
} 

これはTypescriptエディタの非常にスマートな動作か、これは不具合ですか?

コピー>この動作を確認するためにTypescript Playgroundに上記のコードを貼り付け...

+1

キャストのようなものはタイプスクリプトではありません。値はコンパイル時の型であると主張できますが、partのインスタンスはすでにコンパイラーがそれを宣言するほどスマートですから;) – toskv

答えて

1

型ガードと呼ばれるコンパイラの機能である、あなたはhandbookの高度な種類の章でそれについての詳細を読むことができます。

また、Typescriptにはキャスティングなどはありません。あなたができることは、コンパイル時に値の型をアサートし、コンパイラが割り当てたい型を上書きすることです。

この場合、自動的に自動的に行いますが、

3

私の知る限り、これはV1.4以降で使用可能Type Guards、であることを覚えているよう:

タイプガード

JavaScriptで一般的なパターンは、typeof演算を使用するか、またはinstanceofは の種類を調べることです実行時の式。 TypeScriptは今や がこれらの条件を理解しているので、ifブロックで使用されたときにタイプ推論 をそれに応じて変更します。

関連する問題