首页 > 解决方案 > Typescript,结合元组元素的对象类型

问题描述

是否有可能获取不同对象的元组,并将所有这些对象组合在一起?例如,如果我有一个这样的元组:

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);
}

我能不能让打字稿把这个新对象当作一个

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

在这种情况下是

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

无需手动输入所有内容?

我希望它可以与任何元组和元组内的任何对象一起使用

标签: typescript

解决方案


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

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;
}

游乐场链接


推荐阅读