数组中任意数量的对象类型的并集

时间:2019-12-05 18:45:30

标签: typescript typescript-typings typescript-generics

我一直在尝试创建一种类型,该类型可以根据数组中未知数量的对象类型来推断数组的类型。我希望结果类型是数组中所有类型的并集的数组。

我从advance types documentation看过的一些事情:

  • 联盟类型
  • 条件类型

示例:

interface A {a: number;}
interface B {b: string;}
interface C {c: boolean;}
const a = {a:0}, b = {b:"str"}, c = {c:true};

type UnionOfArrayTypes = /*?*/;

let arr: UnionOfArrayTypes;
arr = [a,b] // A|B[]
arr = [a,c] // A|C[]
arr = [a,b,c] // A|B|C[]

我想避免简单地定义许多可能的定义,并且我想避免将其称为“ any”-我希望打字稿能够从数组本身推断出类型。

编辑:

为了更好地说明提出要求的原因/方式- 我正在定义将多个对象属性组合在一起的扩展/合并功能。

function _merge<T extends object, U extends object>(destination: T, source: U): T & U {
  return {...destination, ...source};
}

export function merge<T extends object, U extends object>(destination: T, ...sources: U[]): T & U {
  return _merge(destination, sources.length == 0 ? undefined : sources.reduce((acc, curr) => {
      return _merge(acc, curr);
  }, sources[0]));
}

我想更改合并功能以采用任意数量的对象并将它们合并在一起,并为返回类型提供正确的联合类型。

当前(在上面的示例中)编译器仅允许merge函数接受单一类型的数组,但是我希望能够将任意数量的不同对象一起传递给它,并获得正确的返回类型。

所以我可以这样使用它:

// using the defined variables from above
const result = merge(a,b,c) // type is the union type A|B|C

0 个答案:

没有答案