【问题标题】:Typescript, combine object types of tuple elementsTypescript,结合元组元素的对象类型
【发布时间】:2020-10-29 21:45:56
【问题描述】:

是否可以获取不同对象的元组,并获得所有这些对象组合的类型?例如,如果我有一个这样的元组:

const t = tuple({current: 1}, {old: 2}, {new: 3}); //this should be interpreted as [{current: number;}, {old: number;}, {new: number;}]

然后我将这些对象组合成一个对象:

let newob = {};
for(let ob of t) {
  Object.assign(newob, ob);
}

我能不能让 typescript 把这个新对象当作一个

typeof t[0] & typeof t[1] & typeof t[2]

在这种情况下是

{current: number; old: number; new: number;}

无需手动输入所有内容?

我希望它适用于任何元组和元组内的任何对象

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以使用具有any[] 约束的泛型类型参数来捕获元组类型中的参数作为休息参数。您可以使用UnionToIntersection 描述的here 将所有元组项类型合并为单个交集类型

    type UnionToIntersection<U> = 
      (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
    function tuple<T extends any[]>(...t: T) {
      let newob = {} as UnionToIntersection<T[number]>;
      for (let ob of t) {
        Object.assign(newob, ob);
      }
      return newob;
    }
    

    Playground Link

    【讨论】:

    • 谢谢,这确实有效。但是我注意到一个奇怪的行为,这并不是一个大问题,但是如果您尝试将两个类实例对象放入元组中,并且它们都有一个同名的私有方法,那么整个事情的返回类型为 'never '。如果方法是公共的或受保护的,则不会发生。 Here's demo
    猜你喜欢
    • 2023-04-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2022-01-27
    • 2016-09-15
    相关资源
    最近更新 更多