打字稿array.from(iterator)类型错误,无法转换?

保罗23

在将流程代码转换为打字稿时,使用迭代器会发生错误。迭代器缺少某些内容

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就是这么宽容的)?

TJ人群

您可能知道,迭代器是具有next用于迭代可迭代对象的[Symbol.iterator]方法的对象(具有用于从其获取迭代器方法的对象)。

Array.from接受一个可迭代的(或类似数组的),但是在该代码中它认为它只是在获取一个迭代器

大多数迭代器(包括从标准Ja​​vaScript方法获得的所有迭代器)也是可迭代的,因为它们是[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

下面是相同的代码使用Iterator<T> & Iterable<T>方法同上。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章