类型元组到实例元组

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 通用休息元组类型从类元组返回实例元组

python元组到dict

Python3 typehints - 传入类型元组后,指定返回值是这些类型实例的元组

元组到参数包

组合数据类型练习,英文词频统计实例上列表,元组,字典,集合的遍历。 总结列表,元组,字典,集合的联系与区别。

4.元组