在将流代码转换为 typescript 时,使用迭代器时会发生错误。迭代器缺少一些东西
const iter: Iterator<RouteData> = contentMap.routes();
const contentArray: Array<RouteData> = Array.from(iter);
它给出了以下错误,注意这指向了 second 行,所以 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();
}
typescript 的编译目标是“es6”,所以 map 应该完全支持?还是从迭代器创建数组是不可能的,我做错了吗(babel 就那么宽容)?
最佳答案
您可能知道,迭代器 是一个具有 next
的对象用于遍历 iterable 的方法(具有 [Symbol.iterator]
方法的对象,用于从中获取迭代器)。
Array.from
接受一个可迭代(或类似数组),但在该代码中它认为它只是获取一个迭代器。
大多数迭代器,包括您从标准 JavaScript 方法获得的所有迭代器,也是可迭代的,因为它们实现了 [Symbol.iterator]() { return this; }
。 ,直接或间接地通过迭代器原型(prototype)——但并非所有人都这样做。因此,假设所有迭代器都是可迭代的是不安全的。
您可能想要更新 routes
显示它返回的东西既是迭代器又是可迭代的:
routes(): Iterator<T> & Iterable<T> {
return this._routes.values();
}
然后:
const iter = contentMap.routes();
const contentArray = Array.from(iter);
(不需要显式类型,TypeScript 会推断它们。)
Here's a version在 Playground 上使用 Iterator
演示问题.
Here's that same code使用 Iterator<T> & Iterable<T>
如上。
关于arrays - Typescript array.from(iterator) 类型不正确,无法转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61346153/