在将流程代码转换为打字稿时,使用迭代器会发生错误。迭代器缺少某些内容
const iter: Iterator<RouteData> = contentMap.routes();
const contentArray: Array<RouteData> = Array.from(iter);
它给出以下错误,请注意,它指向第二行,所以iter
类型正确/返回的contentMap.routes()
是迭代器:
Error:(109, 55) TS2769: No overload matches this call.
Overload 1 of 4, '(iterable: Iterable<RouteData> | ArrayLike<RouteData>): RouteData[]', gave the following error.
Argument of type 'Iterator<RouteData, any, undefined>' is not assignable to parameter of type 'Iterable<RouteData> | ArrayLike<RouteData>'.
Property 'length' is missing in type 'Iterator<RouteData, any, undefined>' but required in type 'ArrayLike<RouteData>'.
Overload 2 of 4, '(arrayLike: ArrayLike<RouteData>): RouteData[]', gave the following error.
Argument of type 'Iterator<RouteData, any, undefined>' is not assignable to parameter of type 'ArrayLike<RouteData>'.
为什么会发生这种情况,我该如何解决?
迭代器在以下位置创建:
routes():Iterator<RouteData> {
return this._routes.values();
}
打字稿的编译目标是“ es6”,因此应该完全支持地图吗?还是只是不可能从迭代器创建数组,而我做错了所有事(而Babel就是这么宽容的)?
您可能知道,迭代器是具有next
用于迭代可迭代对象的[Symbol.iterator]
方法的对象(具有用于从其获取迭代器的方法的对象)。
Array.from
接受一个可迭代的(或类似数组的),但是在该代码中它认为它只是在获取一个迭代器。
大多数迭代器(包括从标准JavaScript方法获得的所有迭代器)也是可迭代的,因为它们是[Symbol.iterator]() { return this; }
通过迭代器原型直接或间接实现的,但并非全部都能实现。因此,假设所有迭代器都是可迭代的是不安全的。
您可能需要更新routes
以显示它返回既是迭代器又是可迭代的内容:
routes(): Iterator<T> & Iterable<T> {
return this._routes.values();
}
然后:
const iter = contentMap.routes();
const contentArray = Array.from(iter);
(不需要这些上的显式类型,TypeScript会推断出它们。)
下面是相同的代码使用Iterator<T> & Iterable<T>
方法同上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句