以下是我目前遇到的问题的一个例子。 我正在尝试编写一个 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
。我需要在 mixin 中以某种方式推断出A<T = {}>
中的T
,并将其从提供的base: T
传递给ConstructorOf<A>
。
你真的需要限制ApplyC
函数只接收A
的子类吗? 如果没有,您可以将A
替换为any
,例如:
function ApplyC<T extends ConstructorOf<any>>(base: T) {
然后D.init()
只会返回IB
,没有别的。