Javascript 流量可调型
我试图在javascript中定义一个zip函数,并添加流类型 我目前拥有的类型如下:Javascript 流量可调型,javascript,flowtype,Javascript,Flowtype,我试图在javascript中定义一个zip函数,并添加流类型 我目前拥有的类型如下: export function *zip<T>(...iterables:Array<Iterable<T>>): Iterable<Array<T>> { const iterators = iterables.map(iterable => iter(iterable)); while(true){ const it
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.92.1上的错误为:
无法返回undefined,因为undefined与属性的返回值@@iterator
的类型参数Yield
的数组元素中的T
不兼容
根据zip生成器的返回类型,预计将生成
数组类型的值。
然而,yield items.map(item=>item.value)
生成数组
,因为映射回调中的每个项
都是IteratorResult
。因此,实际收益率值和预期收益率值之间存在类型不匹配
也就是说,您已经在使用以下工具检查您的项目:
if (items.some(item => item.done)){
return;
}
,因此,在执行达到屈服
时,所有项值都不能未定义
。不幸的是,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>);
}
}
导出函数*zip(…iterables:Array):Iterable{
常量迭代器=iterables.map(iterable=>iter(iterable));
while(true){
const items=iterators.map(iterator=>iterator.next());
if(items.some(item=>item.done)){
返回;
}
yield((items.map(item=>{return item.value}):数组):数组);
}
}
谢谢!这完全有道理。我太专注于返回
,因为错误明确指向这一行。我已经更新了flow,以查看错误是否更好(从0.64到0.92.1)。我对此错误的新错误是:无法返回undefined,因为undefined[1]与属性返回值@@iterator
的类型参数Yield
[3]的数组元素中的T
[2]不兼容。这个故事的寓意是,在下次提问之前,我应该更新一下。
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>);
}
}