Javascript 流量可调型

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

我试图在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.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>);
  }
}