2017-07-27 61 views
0

我正在努力定義一個方法來正確地獲取基類的子類。方法參數應該是給定類的子類

handle(content: AbstractClass) 

直接與繼承的類調用它導致參數類型的「具體類」是不能分配給類型「抽象類」的參數。

我已經與一個接口,類似的結果參數類型「的typeof具體類」的嘗試是不分配給類型的參數「接口」

class AbstractClass implements Interface 

handle(content: Interface) 

我已經發現一個問題類似topic但該解決方案也不能幫助我。

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); 
    } 
} 

playground

我想要實現的方法show可以採取抽象類的每一個實現方式中,不管如何定義F.E.不同的構造函數和類似的。
我通過構造函數將它與Angular和Angular resolves依賴關係結合使用。

我該如何用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

相關問題