从数组返回类型的并集

时间:2019-03-07 15:26:01

标签: typescript typescript-generics

我希望此合并方法的返回类型为传递给它的所有不同数组类型的并集。

let ws = fs.createWriteStream('accounts.csv', { flag: 'a' });

但是我得到那个错误。显然,这是预料之中的,但我不知道如何键入该值以从可迭代数组中获取值。

1 个答案:

答案 0 :(得分:1)

嗯,我想人们通常是want errors like this to happen,因为异构数组要比同类数组少见,而且类型推断一直在扩展,直到起作用才捕获实际错误。

如果您要解决此问题,则可以朝另一个方向发展:强制类型推断成功,然后根据需要从中calculateT的值:

async function merge<I extends Array<AnyIterable<any>>>(...iterables: I) {
  for (const iterable of iterables) {
  }
}

type UnArrayAnyIterable<A extends Array<AnyIterable<any>>> = 
  A extends Array<AnyIterable<infer T>> ? T : never;

现在成功了:

merge([1, 2, 3], ['1', '2', '3']); // I inferred as the tuple `[number[], string[]]`

如果需要T,可以使用UnArrayAnyIterable

declare function foo<I extends Array<AnyIterable<any>>>(...iterables: I): UnArrayAnyIterable<I>;
const ret = foo([1, 2, 3], ['1', '2', '3']); // string | number

好的,希望能有所帮助。祝你好运!