类型元组到实例元组
Posted
技术标签:
【中文标题】类型元组到实例元组【英文标题】: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)[]
?
如何让它以任何顺序支持任意数量的构造函数?
【问题讨论】:
【参考方案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)[]
。
【讨论】:
以上是关于类型元组到实例元组的主要内容,如果未能解决你的问题,请参考以下文章
通过 typescript 3.0 通用休息元组类型从类元组返回实例元组
Python3 typehints - 传入类型元组后,指定返回值是这些类型实例的元组