2016-05-17 16 views
4

Typescriptは構造型の互換性のための直接テストをサポートしていますか?Typescript型の互換性テスト

C#が活字体で、チェックのこの種を行うためにいくつかの直接的な方法はありisオペレータとタイプ表面IsAssignableFrom(object instance)

if (foo is SomeType) ... 
if (SomeType.IsAssignableFrom(foo)) ... 

サポートしていますか私は必要なメンバーごとに精査しなければなりませんか?

instanceofは、おそらく手元のケースではありますが、プロトタイプチェーンをチェックする代わりに、構造的な互換性を尊重しません。

はい、私が知っているように、TypescriptのinstanceofはC#のis演算子と直接同等です。しかし、私は構造型を指定することから始めました。

多分私は私がここに適切な答えを信じてObject

答えて

1

にいんちき方法を置くべき

はないですが、!

これを避けるために、Typescriptのタイプ情報はコンパイル時にのみ存在します。実行時に構造的平等のチェックを行う方法はありません。コンパイル時にこのチェックを行うことはできますが、これは単に割り当てと呼ばれ、おそらくあなたが尋ねていることではありません。

要するに、必要なメンバー(通常は)を調査する必要がありますが、これについて賢明になる方法はいくつかあります。


言語はuser-defined type guards

これらは、便利な機能として素晴らしいですし、安全に(お好みの用語に依存する)タイプを精製/指定/ダウンキャストの方法ですがサポートされてい活字体1.6の通り。典型的な方法(.hasOwnPropertyなど)で望むなら、あるタイプの存在を手動でチェックすることができます。私の経験上、メッセージタイプをディスパッチする方法としてより効果的です。ほとんどのメッセージパッシングシステムでは、typeプロパティがあります。あなたは関数を定義することができます

function isConfigGetMsg(msg: BaseMessage): msg is ConfigGetMsg { 
    return msg.name === MsgTypes.CONFIG_GET_MSG; 
} 

//and use it as 
if (isConfigGetMsg(msg)){ 
    console.log(msg.key); //key being a ConfigGetMsg only value 
} 

これはあなたのメッセージが整形式である限り、うまくいくでしょう。ご覧のとおり、特定の情報をテストする必要があります。あなたがより一般的なアプローチを望むなら、それはそれを不可能にします。


あなたが言及したように、必要な各メンバーを調べることができます。あなたはこのようなものを作成するために、以前の技術を使用することによって、自分自身のためにそれは少し簡単にすることができます。

interface One { 
    a: number 
} 
interface Two extends One { 
    b: string 
} 
function isAssignableTo<T>(potentialObj:Object, target:T) : potentialObj is T { 
    return Object.keys(target).every(key => potentialObj.hasOwnProperty(key)) 
} 

let a: Object = { 
    a: 4, 
    b: 'hello' 
}; 

let b: Two = undefined; 

if(isAssignableTo(a, b)) { 
    b = a; 
} 

isAssignableTo機能は、ここで重要なポイントとなっています。パラメータの方向は議論の余地がありますが関連性がないので、好きなようにしてください。これは理想的な解決策ではありません。たとえば、状態を暗示し、共通の機能ではないことなど、非機能のプロパティのみに基づいて物事を割り当てることができます。それを考慮に入れてチェックを延長しようとすることもできますが、落とし穴は無関係です。


申し訳ありませんが、唯一の「真の」回答はまだ実行可能ではないと信じています。クラスを使って作業している場合は、デコレータを使用して、後で反射/検査に使用できるタイプ情報など、アプリケーションに関するメタデータを取得できます。これを行う独自のデコレータを作成することもできますが、typescript's own metadata generation for class properties.を利用してtsconfigフラグをオンにすることもできます。

これは、metadata reflection apiが存在することを前提としています。この情報を抽出するには、これを使用する必要があります。その後、以前のisAssignableTo関数を書き換えてメタデータを処理することができます。私が正しく覚えていれば、タイプは文字列として格納され、サブタイプを持つと一致しないという問題があります。


はとにかく、私は役立ちます願っています。申し訳ありませんが、私はあなたに簡単なイエスを与えることができませんでした私の運を知っているのは、実際には割り当て;)を探していただけです。

+0

いいえ、あなたの解釈にスポットがありました。私は実際に実行時割り当ての互換性チェックが必要でした。アプリケーションは、データベースから文字列を解析しています。これは単一のプリミティブXとして始まりました。次に配列[X、Y、Z]に変更されました。次に、コンパレータとプリミティブの配列{"Comparator": "any"、 "Values":[X、Y、Z]}を定義するオブジェクト。 JSONとしてパースしてから、レガシーエンコーディングを正規化する前に得られたものを調べることができます。プリミティブのプリミティブまたは配列は値を提供し、コンパレータは「任意」です。 –