异步函数仅在面向 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。 async
和 es6
目标依赖于生成器。它们不能被填充。通常 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 时出现错误消息