【发布时间】:2021-10-22 16:41:50
【问题描述】:
我有一个名为Entity 的基类和一个扩展Entity 的子类DebugEntity。从Entity 派生的子类可以有自己的带有任意参数的构造函数。我希望将这些参数输入到 Entity 类中的静态 make 方法中。
经过多次尝试/错误,我走到了这一步:
class DebugEntity extends Entity
{
public constructor(name: string, age: number)
{
console.log({name, age});
}
public testMe(): void
{
console.log('Hello from DebugEntity')
}
}
export abstract class Entity
{
public static async make<T extends Entity, K extends new (...args: any[]) => T>(
this: K,
...args: K extends new (...args: infer U) => T ? U : never
): Promise<T>
{
const entity = new this(...args);
// Do some async stuff (unrelated to question)
return entity;
}
}
Typescript 正确推断构造函数参数。例如:DebugEntity.make() 现在需要两个参数 [string, number]。但是,Typescript 认为 make 的返回类型是 Entity 而不是 DebugEntity。
在构造的实体上调用testMe会产生以下结果:
Property 'testMe' does not exist on type 'Entity'.
我可以通过将 this: 参数修改为 this: new (...args: any[]) => T 轻松解决此问题,但由于某种原因,这会破坏参数类型推断。
我应该如何解决这个问题?
提前致谢!
【问题讨论】:
标签: typescript generics