2017-07-27 54 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

相关问题