2017-07-27 3 views
0

私は、基本クラスのサブクラスを正しく取るメソッドを定義するのに苦労しています。継承したクラスで、それを直接呼び出すメソッドのパラメータは、指定されたクラスのサブクラスである必要があります

handle(content: AbstractClass) 

は「ConcreteClassは」「AbstractClass」型のパラメータに割り当てられないタイプの引数につながります。

私はインターフェイス、同様の結果「typeof演算ConcreteClass」タイプの引数でそれを試してみましたタイプのパラメータに割り当てられない「インターフェース」

class AbstractClass implements Interface 

handle(content: Interface) 

私は似たtopicに質問を発見したが、解決策は私には役に立たない。私はこの方法showは関係なく、それがf.e.どのように定義されるかAbstractClassの全ての実施を取ることができることを実現したいplayground

interface ClassConstructor<T extends AbstractClass> { 
    new(): T; 
} 

abstract class AbstractClass { 
    private test: string; 

    constructor(value: string) {} 
} 

class B extends AbstractClass { 
    private test2: string; 

    constructor(value: string, value2: number) { 
    super(modal); 
    } 
} 

class S1 { 
    show(content: ClassConstructor<AbstractClass>) {} 

    b() { 
    this.a(B); 
    } 
} 

異なるコンストラクタなどがあります。
私はそれをコンストラクタを介して角と角度の依存関係と組み合わせて使用​​しています。

TypeScriptでどうすればいいですか?

答えて

0

これは、コンストラクタの署名が一致しないためです。

この作品:

interface ClassConstructor<T extends A> { 
    new(value: string): T; 
} 

class B extends A { 
    private test2: string; 

    constructor(value: string) { 
     super(value); 
    } 
} 

class S1 { 
    a(content: ClassConstructor<B>) {} 
    b() { 
     this.a(B); 
    } 
} 

は今、さまざまなコンストラクタは、同じ署名を共有しています。

+0

コンストラクタが異なる場合は使用できません。 – CSchulz

+0

コンストラクタが異なる場合は、おそらく別の解決策が必要です。あなたの正確なユースケースは何ですか?これまでに提供したコードでは、 'a(content:{new(value:string、value2:number):B}){}'に変更するだけで、すべてうまくいきます。 'ClassConstructor'は本当に必要ありません。だからあなたの本当のシナリオであなたの質問を更新してください、あなたに役立つ答えを得るかもしれない –

+0

私は自分の質問を更新しました。私はそれが今より明確であることを願っています。私は異なる方法で拡張される基本クラスと、異なる依存関係に起因する異なるコンストラクタを持っています。私は、与えられたメソッドがあらゆる実装をとることができることを達成したい。 – CSchulz

関連する問題