以下是我目前遇到的问题的示例。我正在尝试编写一个mixin,以正确地推断和反映提供给mixin的类的子类中的泛型类型。
abstract class A<T = {}> {
public abstract init(): T;
}
interface IB {
something: string;
}
class B extends A<IB> {
public init(): IB {
return null;
}
}
type ConstructorOf<T = {}> = new (...args: any[]) => T;
function ApplyC<T extends ConstructorOf<A>>(base: T) {
abstract class C extends base {
}
return C;
}
class D extends ApplyC(B) {
constructor() {
super();
// this.init()
}
}
在我写this.init()
的地方,智能感知告诉我init()
过载,一个是init(): {}
,另一个是init(): IB
,这是问题所在是我不希望出现过载,我只是希望IB出现。
我需要在混合中以某种方式推断T
中的A<T = {}>
,并将其从提供的ConstructorOf<A>
传递给base: T
。
答案 0 :(得分:0)
您真的需要限制ApplyC
函数以仅接收A
的子类吗?
如果否,则可以将A
替换为any
,例如:
function ApplyC<T extends ConstructorOf<any>>(base: T) {
然后D.init()
将仅返回IB
,而不会返回其他任何内容。