gpt4 book ai didi

javascript - 流可迭代类型

转载 作者:行者123 更新时间:2023-11-30 14:10:15 25 4
gpt4 key购买 nike

我正在尝试在 javascript 中定义一个添加了流类型的 zip 函数。

我目前拥有的类型如下:

export function *zip<T>(...iterables:Array<Iterable<T>>): Iterable<Array<T>> {
const iterators = iterables.map(iterable => iter(iterable));
while(true){
const items = iterators.map(iterator => iterator.next());
if (items.some(item => item.done)){
return;
}
yield items.map(item => item.value);
}
}

function *iter<T>(iterable:Iterable<T>): Iterator<T> {
yield* iterable;
}

错误流 (0.64) 给我的是在 return; 行,它说:

Generator
This type is incompatible with the expected return type of
$Iterable: tools/misc.js:182
Property `@@iterator` is incompatible:
function type: /private/tmp/flow/flowlib_38c3acbb/core.js:508
This type is incompatible with
function type: /private/tmp/flow/flowlib_38c3acbb/core.js:503

example in flow's documentation看起来非常相似,所以我不确定这里出了什么问题。

也欢迎任何有关类型(甚至代码本身)的建议。

编辑 flow 版本 0.92.1 的错误是:

Cannot return undefined because undefined is incompatible with T in array element of type argument Yield of the return value of property @@iterator.

最佳答案

基于 zip 生成器返回类型,预计会产生 Array<T> 类型的值.然而,yield items.map(item => item.value);生产 Array<void | T> , 因为每个 item在该 map 回调中是 IteratorResult<T, void> .因此,实际 yield 值和预期 yield 值之间存在类型不匹配。

话虽如此,您已经在检查您的元素:

if (items.some(item => item.done)){
return;
}

,所以当执行到达 yield 时所有项目值都不能是 undefined .不幸的是,Flow 无法自行解决。但是我们可以强制它对该值进行类型转换:

 export function *zip<T>(...iterables:Array<Iterable<T>>): Iterable<Array<T>> {
const iterators = iterables.map(iterable => iter(iterable));
while(true){
const items = iterators.map(iterator => iterator.next());
if (items.some(item => item.done)){
return;
}
yield ((items.map(item => { return item.value }): Array<any>): Array<T>);
}
}

关于javascript - 流可迭代类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54591105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com