Typescript 从数组返回类型的并集

Typescript 从数组返回类型的并集,typescript,typescript-generics,Typescript,Typescript Generics,我希望这个merge方法的返回类型是所有不同数组类型的并集 type AnyIterable<T> = Iterable<T> | AsyncIterable<T> async function* merge<T>(...iterables: Array<AnyIterable<T>>) { for (const iterable of iterables) { yield* iterable } } m

我希望这个merge方法的返回类型是所有不同数组类型的并集

type AnyIterable<T> = Iterable<T> | AsyncIterable<T>

async function* merge<T>(...iterables: Array<AnyIterable<T>>) {
  for (const iterable of iterables) {
    yield* iterable
  }
}

merge([1, 2, 3], ['1', '2', '3'])
// Argument of type 'string[]' is not assignable to parameter of type 'AnyIterable<number>'.
// Property '[Symbol.asyncIterator]' is missing in type 'string[]' but required in type 'AsyncIterable<number>'.ts(2345)
键入AnyIterable=Iterable | AsyncIterable
异步函数*合并(…可配置文件:数组){
for(可分解常数){
收益率
}
}
合并([1,2,3],'1','2','3'])
//“string[]”类型的参数不能分配给“AnyIterable”类型的参数。
//类型“string[]”中缺少属性“[Symbol.asyncIterator]”,但类型“AsyncIterable”中需要属性“[Symbol.asyncIterator]”。ts(2345)

但我得到了那个错误。很明显,这是意料之中的,但我不知道如何键入它来从iterables数组中获取值。

嗯,我认为人们通常会这样做,因为异构数组比同构数组更不常见,并且总是扩大到有效的类型推断不会捕捉到实际错误

如果您想解决此问题,则可以采取另一种方法:强制类型推断成功,然后在需要时从中选择
T
的值:

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;
如果您想要
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
声明函数foo(…iterables:I):不可数组化;
const ret=foo([1,2,3],'1','2','3']);//字符串|编号

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

你真是太棒了。我感谢你的帮助。为什么UnarrayanyInterable中需要一个
?我不太懂语法,这是一个错误。
declare function foo<I extends Array<AnyIterable<any>>>(...iterables: I): UnArrayAnyIterable<I>;
const ret = foo([1, 2, 3], ['1', '2', '3']); // string | number