2017-12-11 6 views
1

奇妙なタイトルのため申し訳ありませんが、私は1つの文で何をしようとしているのかをよくわかりません。クラスデコレータ、クラスが拡張されて他のクラスを実装していることを確認する方法

私は、この1つのクラスからすべて拡張し、この他のクラスを実装するクラスの束を定義する必要があります。

class SoulCoughing extends Super implements BonBon { /.../ } 
class MoveAside extends Super implements BonBon { /.../ } 
class LetTheManGoThru extends Super implements BonBon { /.../ } 

私はこれらのクラスのデコレータとして使用する一種のラッパー関数を書いています。

const Eminem = function(klass: Constructable<????>) { 
    const instance = new klass(); 
    // Do stuff 
} 

Constructableそう活字体がコンストラクタを持っていないというエラーがスローになるので私が使用している少しのインタフェースです。

interface Constructable<T> { 
    new(): T; 
} 

は今ここに私の問題があり、私は私のラッパー関数のパラメータklassに割り当てるどのタイプか分かりませんか?私はこれをやって試してみました:

... function(klass: Contrusctable<Super & BonBon>) 

と、この:

... function(klass: Contrusctable<Super | BonBon>) 

私も、このように私の構築可能インターフェースの変更を試みた:

​​

を私はArgument of type 'typeof SoulCoughing' is not assignable to parameter of type 'Constructable<everythingIveTriedSoFar>'エラーを取得しておきます。

私の質問は、どのタイプ定義をパラメータklassとともに使用すべきですか? anyを使うことができますが、渡されるクラスがSuperに拡張され、BonBonが実装されていることを確認したいと思います。

答えて

1

クラスSoulCoughingなどは実際には引数なしのコンストラクタを持たないため、Constructable<{}>としては動作できません。最も可能性の高い原因は、Superのコンストラクタには必須の引数があり、すべてのサブクラスがデフォルトでnew()と一致しないことになります。これはまた、Eminemの実装がおそらくnew klass(...)をいくつかの引数とともに呼び出すことを意味していることにも注意してください。

正しい修正方法は、Constructable<T>を正しい引数型のコンストラクタとして宣言することです。以下のよう

interface Constructable<T extends Super & BonBon = Super & BonBon> { 
    new(chump: number, change: string): T; // same args as Super 
} 

Eminem

const Eminem = function(klass: Constructable) { 
    const instance = new klass(2, "rise"); 
    // Do stuff 
} 

し、最終的に:

class Super { 
    constructor(elevator: number, mezzanine: string) { 
    //... 
    } 
} 

次にあなたが一致するConstructableを定義できますのはSuperは次のようになりましょう

Eminem(SoulCoughing); // no error 

私はあなたが活字体がそうのように、特定のサブクラスの種類を保存したい場合は、一般的なConstructableを保持:助け

const SlimShady = function <T extends Super & BonBon>(klass: Constructable<T>): T { 
    return new klass(2, "fat"); 
} 

// returns same type as passed-in constructor 
const cutLean: MoveAside = SlimShady(MoveAside); 

さて、希望;がんばろう!

関連する問題