gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:29:04 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com