Typescript TS2318:找不到全局类型';异步可编解码器';-异步发电机
我有一个异步生成器:Typescript TS2318:找不到全局类型';异步可编解码器';-异步发电机,typescript,async-await,Typescript,Async Await,我有一个异步生成器: 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 it
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,这会给我错误:
错误TS2318:找不到全局类型“AsyncIterableTerator”。
示例ts(10,26):
错误TS2504:类型必须具有返回异步迭代器的“Symbol.asyncIterator”方法
如何修复此错误以及如何运行异步生成器 是一种esnext
功能;因此,您必须明确地将esnext
作为目标,或者添加esnext.asynciterable
库,以便typescript支持语法。但是,typescript目前不处理运行时符号的实现,因此需要进行多边形填充
Polyfill+向下编译
在tsconfig.json
{
"compilerOptions": {
"target": "es2015",
"moduleResolution": "node",
"module": "commonjs",
"lib": [
"dom",
"es2015",
"esnext.asynciterable"
]
}
}
只需在执行任何其他操作之前创建一个新符号,就可以polyfillSymbol.asyncIterator
if(Symbol["asyncIterator"] === undefined) ((Symbol as any)["asyncIterator"]) = Symbol.for("asyncIterator");
正常编译和运行
这也应该应用于任何可重用的包中——理想情况下是在模块的main
脚本的第一行
本地支持
如果您的目标是节点7及更高版本,那么实际上可以使用一个标志以本机方式运行异步迭代器
在tsconfig.json中设置目标:“esnext”
,编译并运行
node --harmony_async_iteration example.js
同样也适用于ts节点,您可以在其中直接运行它
ts-node --harmony_async_iteration example.ts
具有节点9;它是在--harmony
标志下进行的
从节点10开始;默认情况下,它处于启用状态
警告:
当您将typescript编译的异步gen代码与babel的向下编译混合在一个Web包包中时,我遇到了一些兼容性问题。这可能是由于巴别塔的多边形填充如何寻找符号,然后在缺少符号时创建一个符号。兼容性问题在于,babel代码似乎不认为typescript(+Symbol polyfill)代码具有Symbol.asyncIterable
键条目
也可以通过使用babel插件将使用的相同符号polyfill来避免问题:
import "core-js/modules/es7.symbol.async-iterator"
谢谢你的解释。有一个问题,当我使用“Polyfill+Down Compile”指令时,我必须添加带有
(symbol as any)[“asyncIterator”]
的asyncIterator符号,而不是(symbol)[“asyncIterator”]
,以避免出现tsc错误——为什么?使用react或tsx文件?我无论如何都会更新;谢谢。:)我仍然想解决在tsconfig.json中找不到全局类型'AsyncIterableIterator'
@reconbot非常确定您需要“lib”:[…,“esnext.asynciterable”]
条目的问题。然后,它应该加载异步iterableiterator
的键入(在您这样做之后尝试重新启动vscode,因为有时语言服务可能会卡住)。