异步函数仅在面向 ECMAScript 2015 或更高版本时可用

Posted

技术标签:

【中文标题】异步函数仅在面向 ECMAScript 2015 或更高版本时可用【英文标题】:Async functions are only available when targeting ECMAScript 2015 or higher 【发布时间】:2017-04-11 17:52:24 【问题描述】:

我希望能够使用 async 关键字,但我希望我的 typescript 能够编译成 es5 代码,以便我的代码可以在普通人的浏览器中运行。当我尝试在 Visual Studio 代码中使用 async 时出现此错误。

异步函数仅在面向 ECMAScript 2015 或 更高。

我认为定位es6意味着编译打字稿的输出javascript将是es6,而es6在大多数浏览器上都不起作用?

这是我的tsconfig.json


  "compilerOptions": 
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "lib": ["es2015", "dom"],
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": true,
    "outDir":"js/app/",
    "typeRoots": [
      "./node_modules/@types"
    ]
  ,
    "exclude": [
    "node_modules",
    "app/test"
  ]

我想知道 lib 字段是否可以使它工作,因为它说 "es2015" 但它没有。

我也在想也许core-js shim 使async 可用,但我只在我的index.html 中包含该 shim,如下所示:

<script src="node_modules/core-js/client/shim.min.js"></script>

所以我认为它不会使async 在编译时可用。有没有更好的导入 core-js 的方法?

如何使async 可用,但又不让我的代码无法在大多数浏览器上运行?

【问题讨论】:

这应该可以在 Typescript 2.1 中使用,现在很快就会实现...... core-js 是 polyfill。 asynces6 目标依赖于生成器。它们不能被填充。通常 Babel 应该与 TS 一起使用,以将它们转译为 ES5。如前所述,async for es5 目标在 2.1 开发版本中可用。 【参考方案1】:

大多数主流浏览器都支持ECMAScript6

正如@loganfsmyth 对此答案的 cmets 所述,

请记住,“大多数主要浏览器”仍然只能涵盖 您的用户群中的一小部分。

Firefox

Chrome

From Safari's website,

ES6 ECMAScript 2015 标准,也称为 ES6,完全是 支持,将这一重大的 JavaScript 演变带到 macOS 上的 Safari 和 ios

你将不得不改变,

"target": "es5",

"target": "es6",

ES6 目标中的 TypeScript 1.7 async/await 支持(Node v4+) TypeScript 现在支持引擎的异步函数 对 ES6 生成器的原生支持,例如节点 v4 及更高版本。 异步函数以 async 关键字为前缀;等待 暂停执行,直到异步函数返回承诺 实现并从返回的 Promise 中解包值。

【讨论】:

请记住,“大多数主流浏览器”仍然只能覆盖一小部分用户群。

以上是关于异步函数仅在面向 ECMAScript 2015 或更高版本时可用的主要内容,如果未能解决你的问题,请参考以下文章

访问器仅在针对 ECMAScript 5 及更高版本时可用 - 使用 TypeScript 时出现错误消息

面向对象1.7

如何仅在 ES2015 中生成从 0 到 n 的数字范围?

es2017新特性

深入掌握 ECMAScript 6 异步编程:Generator 函数的含义与用法

ECMAScript面向对象——之原型对象