Typescript 从数组返回类型的并集
我希望这个merge方法的返回类型是所有不同数组类型的并集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
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