setTimeout(r, 900)); -6ren">
gpt4 book ai didi

typescript - TS2318 : Cannot find global type 'AsyncIterableIterator' - async generator

转载 作者:搜寻专家 更新时间:2023-10-30 20:32:34 27 4
gpt4 key购买 nike

我有一个异步生成器:

async function* foo() {
yield "wait...";
await new Promise(r=>setTimeout(r, 900));
yield new Promise(r=>setTimeout(()=>r("okay!"), 100));
}

async function main() {
for await (let item of foo()) {
let result = await item;
console.log(result);
}
}

main();

但是对于 typescript 2.3 这给了我错误:

error TS2318: Cannot find global type 'AsyncIterableIterator'. example.ts(10,26):

error TS2504: Type must have a 'Symbol.asyncIterator' method that returns an async iterator.

如何修复此错误以及如何运行异步生成器?

最佳答案

Symbol.asyncIterator是一个 esnext 特性;因此您必须显式定位 esnext 添加 esnext.asynciterable 库,以便 typescript 支持该语法。但是目前typescript在运行时处理Symbols的实现,所以需要polyfill。

Polyfill + 向下编译

"esnext.asynciterable"添加到tsconfig.json中的lib

{
"compilerOptions": {
"target": "es2015",
"moduleResolution": "node",
"module": "commonjs",
"lib": [
"dom",
"es2015",
"esnext.asynciterable"
]
}
}

您可以在执行任何其他操作之前通过简单地创建一个新的 Symbol 来填充 Symbol.asyncIterator

if(Symbol["asyncIterator"] === undefined) ((Symbol as any)["asyncIterator"]) = Symbol.for("asyncIterator");

正常编译运行。

这也应该应用于任何可重用的包 - 最好是在模块的 main 脚本的第一行

原生支持

如果您的目标是节点 7 及更高版本,您实际上可以使用标志 native 运行异步迭代器。

在tsconfig.json中设置target: "esnext",编译运行

node --harmony_async_iteration example.js

同样适用于 ts-node,您可以直接运行它。

ts-node --harmony_async_iteration example.ts

节点 9;它已在 --harmony 标志下上演

从节点 10 开始;它是默认启用的。

警告:

当您在 webpack 包中混合使用 typescript 编译的异步生成代码和 babel 的向下编译时,我遇到了一些兼容性问题。这可能是由于 babel 的 polyfill 如何查找符号,然后在它丢失时创建一个。兼容性问题是 babel 代码似乎不认为 typescript (+Symbol polyfill) 代码有 Symbol.asyncIterable key-entry。

也可以通过使用与 babel 的插件相同的 Symbol polyfill 来避免这个问题:

import "core-js/modules/es7.symbol.async-iterator"

关于typescript - TS2318 : Cannot find global type 'AsyncIterableIterator' - async generator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43694281/

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