web-dev-qa-db-ja.com

TypeScriptによるクラス型チェック

私は TypeScript にとても興奮していたので、私はそれを試し始めました。 Actionscript開発者として、それはJavascriptをそれほど難しくしません。

ただし、ActionScriptでは、 is演算子 を使用して実行時に型を確認することができます。

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

ある変数(extendsまたはor)がTypeScriptの特定のクラスかインタフェースかを検出することは可能ですか?私は言語仕様でそれについて何かを見つけることができませんでした、それはクラス/インタフェースで働くときそこにあるべきです。

183
Mark Knol

4.19.4 instanceof演算子

instanceof演算子は、左オペランドがAny型、オブジェクト型、または型パラメータ型で、右オペランドがAny型または 'Function'インタフェース型のサブタイプであることを必要とします。結果は常にブールプリミティブ型です。

だからあなたは使用することができます

mySprite instanceof Sprite;

この演算子はActionScriptにもありますが、今後は使用しないでください。

ActionScript 3.0の新機能であるis演算子を使用すると、変数または式が特定のデータ型のメンバーであるかどうかをテストできます。以前のバージョンのActionScriptでは、instanceof演算子がこの機能を提供していましたが、ActionScript 3.0では、instanceof演算子をデータ型メンバーシップのテストに使用しないでください。手動の型チェックには、instanceof演算子の代わりにis演算子を使用する必要があります。式x instanceof yは、xのプロトタイプチェーンでyの存在を確認するだけであるためです(ActionScript 3.0では、プロトタイプチェーンでは継承の階層).

TypeScriptのinstanceofも同じ問題を共有しています。まだ開発中の言語なので、そのような機能の提案を述べることをお勧めします。

また見なさい:

239
Zeta

TypeScriptには、実行時に変数の型を検証する方法があります。 型の述語を返す検証関数を追加できます。そのため、ifステートメントの中でこの関数を呼び出すことができます。そして、そのブロックの中のすべてのコードがあなたがそれがそうであると思う型として使用するのに安全であることを確認してください。

TypeScriptのドキュメントからの例:

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

https://www.typescriptlang.org/docs/handbook/advanced-types.html

38
Gilad S