【问题标题】: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)[]

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2019-01-15
      • 2018-12-29
      • 1970-01-01
      • 2023-04-01
      • 2020-06-04
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      相关资源
      最近更新 更多