【发布时间】:2019-06-24 14:57:30
【问题描述】:
我正在尝试在 Typescript 中创建一个工厂类。工厂应设置为创建特定类的对象,包括在工厂初始化时设置的默认参数。
这是我到目前为止的想法:
type Constructor<T> = new(...args: any) => T;
class Factory<T> {
private params: ConstructorParameters<Constructor<T>>;
private ctor: Constructor<T>;
init<TCtor extends Constructor<T>>(tConstructor: TCtor,
...params: ConstructorParameters<TCtor>)
{
this.ctor = tConstructor;
this.params = params;
}
create(): T {
return new this.ctor(...this.params);
}
}
class ClassWithParams { constructor(a: number) { } }
const factory = new Factory<ClassWithParams>();
//factory.init(ClassWithParams);
// Compilation error - missing param a
factory.init(ClassWithParams, 1);
console.log(factory.create());
// instance of ClassWithParams
上面的代码运行良好(Typescript playground)。但是,它需要在施工后直接向工厂拨打init() 电话。我无法将init() 代码移动到构造函数中,因为init() 依赖泛型参数TCtor 才能正确地对参数列表进行类型检查。
我可以将 TCtor 设为类的通用参数,但这意味着每次通用引用 Factory 时都需要无缘无故地提供一个额外的类型参数。
有什么想法可以删除 init() 电话吗?
【问题讨论】:
-
我意识到我的答案有一个错误,导致类型信息丢失。请查看更新版本
-
哦,有趣,它似乎对我有用 - 丢失了什么类型的信息?
-
Factory.prototype.create的返回类型错误。试试新版本 -
@AluanHaddad 新的实现不正确 - 不正确的参数没有类型错误。您的意思是
tConstructor: C而不是tConstructor: Constructor<T>吗?
标签: typescript typescript-generics