Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript TS2318:找不到全局类型';异步可编解码器';-异步发电机_Typescript_Async Await - Fatal编程技术网

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"
    ]
  }
}
只需在执行任何其他操作之前创建一个新符号,就可以polyfill
Symbol.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,因为有时语言服务可能会卡住)。