arrays - Typescript array.from(iterator) 类型不正确,无法转换?

标签 arrays typescript iterator

在将流代码转换为 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/

相关文章:

javascript - 从 JSON 对象创建新的 jQuery 数组

javascript - 如何在 Javascript 中查看数组元素是处于奇数位置还是偶数位置?

javascript - angular 2 在 typescript 中使用 javascript 包

javascript - ng build --prod 给我一个错误

c++ - 在函数模板中推导迭代器类型?

java - 在 Java 中创建类数组

javascript - 如何从 Javascript 函数访问在 HTML 隐藏输入中声明的数组?

typescript - 如何使用 Mocha 测试 Typescript 中的类是否抽象?

c++ - 我们可以在没有 'advance' 函数的情况下增加迭代器多个位置吗?

c# - 为什么在 C# 中进行基于模式的编程