2013-04-15 2 views

答えて

4

はい。これで、TypeScriptコンパイラの拡張版を使用して、アプリケーションの各クラスを実装するインターフェイスを知ることができます。このバージョンのコンパイラは、実行時まですべての型情報を格納し、これらの情報を実際のコンストラクタにリンクします。たとえば、次のようなものを書くことができます。

function implementsInterface(object: Object, target: Interface) { 
    const objClass: Class = object.constructor && object.constructor.getClass(); 
    if (objClass && objClass.implements) { 
     let found = false; 
     for (let base of objClass.implements) { 
      let found = interfaceExtends(base, target); 
      if (found) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

// recursive interface inheritance check 
function interfaceExtends(i: Interface, target: Interface) { 
    if (i === target) { 
     return true; 
    } 
    if (i.extends) { 
     let found = false; 
     for (let base of i.extends) { 
      // do a recursive check on base interface... 
      found = interfaceExtends(base, target); 
      if (found) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

あなたはhere

+0

オブジェクトリテラルでは機能しますか? –

+0

はい。テストしなければならないオブジェクトがクラスのインスタンスでない場合、このチェックはフィールドごとに行うことができます。メソッドに渡すインターフェース・メタオブジェクトは、すべての詳細(オプションのフィールドなど)を通知し、それらをオブジェクトに対してチェックすることができます。この種のチェックは遅くなりますが、うまくいくでしょう。開始点として[this](https://github.com/pcan/reflec-ts-examples/tree/master/simple-validator)の例を参照してください。 – pcan

+0

空のインターフェイスでも動作しますか? –

14

現在、タイプは、開発時のみに使用し、時間をコンパイルしています。 型情報は、コンパイルされたJavaScriptコードに変換されません。

コンパイラによるコード生成によって、これが可能になります。現時点では、TypeScriptチームは、最終的なJavaScriptに可能な限り小さなコードを追加しようとしていますが、コンパイルされた出力に新しいメソッドを追加する 'extends'キーワードは例外です。

1

はい、あなたが構成可能なタイプのバリデータでこれを行うことができ、あなたのニーズに合った完全な作業例を見つけることができます。このライブラリをチェックアウト:https://github.com/pelotom/runtypes