2017-01-29 16 views
1

私は、すべての共通スーパークラスから派生した候補リストから特定の型のすべてのインスタンスを返す関数が必要です。TypeScriptでジェネリック型のリストをフィルタリングする方法は?

例えば私が書くことができます:例えばと

class A { 
    protected children: A[] = []; 

    getChildrenOfType<T extends A>(): T[] { 
     let result: T[] = []; 
     for (let child of this.children) { 
      if (child instanceof T) 
       result.push(<T>child); 
     } 

     return result; 
    } 
} 

class B: extends A {} 
class C: extends B {} 
class D: extends A {} 

など

しかし、それはコンパイルされません。 child instanceof T私には "T"は型だけを参照していますが、ここで値と​​して使用されています "。しかし、具体的なクラス(例:C)はそこで動作します。それは明らかに問題を引き起こすジェネリック型です。そのケースで使用される正しい構文は何ですか?そのような一般的なフィルタリングを実装するために必要なことはありますか?

答えて

4

このコードを使用できます。

class A { 
    protected children: A[] = []; 

    getChildrenOfType<T extends A>(t: new (...args: any[]) => T): T[] { 
     let result: T[] = []; 
     for (let child of this.children) { 
      if (child instanceof t) 
       result.push(<T>child); 
     } 

     return result; 
    } 
} 

instanceofの右側は、コンストラクタ関数である必要があります。 new() => MyClass。これをメソッドのパラメータとして指定できます。

var a = new A(); 
// push some childs to a.children 
a.getChildrenOfType(B) 

Check it out on the playground

getChildrenOfType方法は次のように使用することができます。

+0

この解決策は非常に具体的なコンストラクタシグネチャ( 't:new()=> T'部分で定義されている)に対してのみ機能することが判明しました。私は、コンストラクタが拡張されたクラスを使用することはできませんが、このパターンにマッチするクラスは使用できません。この問題の解決策もありますか? –

+0

OK、自分で解決策を見つけたようです。あなたの答えを編集しました。 –

関連する問題