【问题标题】:Tuple of types to tuple of instances类型元组到实例元组
【发布时间】:2021-06-30 12:54:13
【问题描述】:
考虑以下打字稿:
type Constructor<T = {}> = new (...args: any[]) => T
class Foo { }
class Bar { }
function magic(...types: Constructor[]) {
// return tuple of instances in order
}
const [ foo, bar ] = magic([Foo, Bar])
magic() 的实现是什么样的,它返回 [Foo, Bar] 而不是 (Foo | Bar)[]?
如何让它以任何顺序支持任意数量的构造函数?
【问题讨论】:
标签:
typescript
generics
tuples
typescript-generics
mapped-types
【解决方案1】:
我能够修改代码直到它起作用:
class Foo { }
class Bar { }
type Constructor<T = {}> = new (...args: any[]) => T
type Constructors<T extends Constructor[]> = readonly [...T]
type Instances<T extends Constructor[], K extends Constructors<T>> = {
[I in keyof K]: K[I] extends Constructor<infer U> ? U : never
}
function magic<T extends Constructor[], K extends Constructors<T>> (ctors: K): Instances<T, K> {
return ctors.map(c => new c()) as any;
}
const [foo, bar, foo2, bar2] = magic([Foo, Bar, Foo, Bar])
magic([Foo, Bar, Foo, Bar]) 正确返回 [Foo, Bar, Foo, Bar] 类型的映射元组,而不是 (Foo | Bar)[]。