仅当模块选项设置为 es2022 时才允许使用顶级 await 表达式
Top-level ‘await’ expressions are only allowed when the ‘module’ option is set to ‘es2022’, ‘esnext’
要解决错误“Top-level ‘await’ expressions are only allowed when the ‘module’ option is set to ‘es2022’, ‘esnext’”,在函数中使用关键字await
或
async
在文件中设置
选项module
toes2022
和target
to 。es2017
tsconfig.json
下面是错误如何发生的示例。
// ⛔️ Error: Top-level 'await' expressions are only allowed // when the 'module' option is set to 'es2022', 'esnext', // 'system', or 'nodenext', and the 'target' option is set to 'es2017' or higher.ts(1378) const result = await Promise.resolve(42); console.log(result); export {};
我使用该export {}
行使文件成为 ES 模块,因为await
仅允许在作为模块的文件的顶层使用表达式,否则会发出错误。
const result = await Promise.resolve(42); console.log(result); // ⛔️ Error: 'await' expressions are only allowed at the top level // of a file when that file is a module, but this file has no imports // or exports. Consider adding an empty 'export {}' to make this file a module.ts(1375)
在函数await
内部使用关键字async
await
解决错误的一种方法是在函数内部使用关键字async
。
async function example() { const result = await Promise.resolve(42); console.log(result); // 👉️ 42 // 👉️ result is available here } example();
更新你的tsconfig.json
以支持顶级等待
或者,您可以更新文件以支持项目中的tsconfig.json
顶层
。await
要在您的 TypeScript 项目中启用顶级等待,请打开您的
tsconfig.json文件并设置:
module
至es2022
(或更高)target
至es2017
(或更高)或ESNext
tsconfig.app.json
请注意,如果使用 Angular 或构建过程中使用的任何配置文件,您可能还必须在文件中设置选项。
{ "compilerOptions": { "target": "es2017", "module": "es2022", }, "include": ["src/**/*"], "exclude": ["node_modules"] }
await
现在我可以在我的文件中使用顶级index.ts
。
const result = await Promise.resolve(42); console.log(result); export {};
如果出现错误“要加载 ES 模块,请在 package.json 中设置“type”:“module”或使用 .mjs 扩展名。” ,您还必须在文件中设置type
为
。module
package.json
{ "type": "module", // ... rest }
现在您可以运行包含顶级等待的文件。
tsc && node build/index.js
如果您使用include或
files选项,请确保您在其中使用顶级的文件await
包含在您的项目中并且正在被 TypeScript 跟踪。
模块选项设置项目的模块系统。
module
设置为es6
和es2022
(或)之间的区别esnext
在于es2022
增加了对顶级的支持await
。
target选项更改哪些 JavaScript 特性被降级,哪些保持不变。
例如,如果您的目标是 ES5 或更低版本,箭头函数将转换为常规函数。
target
选项设置为es2017
时,实际上是在表示您不想支持不支持某些功能的浏览器。 es2017
根据您的环境,这可能无关紧要。例如,如果您只针对现代浏览器或正在编写服务器端代码,您可能就没问题。
只需确保发出的 JavaScript 能够在您打算运行应用程序的环境中运行。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: