在打字稿中,可以像这样创建工厂函数,并定义返回类型:
function factory1<T>(object: new () => T): T {
return new object();
}
如果我想创建几个不同的对象,我可以将此函数扩展为:
function factory2<T, U>(object1: new () => T, object2: new () => U): [T, U] {
return [new object1(), new object2()];
}
现在我的问题是:这个工厂模式是否可以泛化为采用任意数量的不相关对象类型并仍然返回类型化元组?或者是放弃强类型并恢复使用任何类型的唯一选择?
像这样的东西:
function factory3<T extends any[]>(...objects: {new(): any}[]): [...T] {
// BODY
}
最后一个,factory3,的问题是我们丢失了 T 的类型,而是得到了“typeof T”。例如:
factory3(ClassA, ClassB, ClassC);
// actually becomes this:
factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [typeof ClassA, typeof ClassB, typeof ClassC] {}
// But we want this to happen instead, which is possible for factory 1:
factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [ClassA, ClassB, ClassC] {}