仅当 'module' 选项设置为 'esnext' 时才允许使用顶级 'await' 表达式

Kev*_*ats 7 javascript node.js node-modules stripe-payments

我正在执行 Stripes 集成步骤,但遇到了在步骤 2.1 中发现的代码错误(https://stripe.com/docs/connect/collect-then-transfer-guide#create-an-account-link

我该如何解决这个错误?

代码:

const stripe = require('stripe')('someID');
const account = await stripe.accounts.create({
  type: 'express',
});
Run Code Online (Sandbox Code Playgroud)

错误:

仅当 'module' 选项设置为 'esnext' 或 'system',并且 'target' 选项设置为 'es2017' 或更高版本时,才允许使用顶级 'await' 表达式。 ts(1378)

mik*_*ana 50

实际使用顶级等待(即没有包装器)

我将描述您的问题的原因和解决方案,同时还将向您展示一种从命令行tsc运行文件的更好方法。.ts

以下是您可能错过的一些内容

tsctsconfig.json当提供要编译的文件名时忽略配置。

它也被提到过--help,但我确实同意它有点不直观:

$ npx tsc --help
tsc: The TypeScript Compiler - Version 4.6.2
                                                                                                                     TS
COMMON COMMANDS

  ....

  tsc app.ts util.ts
  Ignoring tsconfig.json, compiles the specified files with default compiler options.
Run Code Online (Sandbox Code Playgroud)

解决方案 1 - 显式指定ts文件并使用命令行参数提供正确的选项:

所以你需要使用:

npx tsc -t es2022 -m es2022 --moduleResolution node --outDir dist src/runme.mts
Run Code Online (Sandbox Code Playgroud)

解决方案 2 -使用intsc指定 .ts 文件srctsconfig.json

这是一个具有顶级等待的正确设置的配置:

{
  // https://www.typescriptlang.org/tsconfig#compilerOptions
  "compilerOptions": {
    "esModuleInterop": true,
    "lib": ["es2020"],
    "module": "es2022",
    "preserveConstEnums": true,
    "moduleResolution": "node",
    "strict": true,
    "sourceMap": true,
    "target": "es2022",
    "types": ["node"],
    "outDir": "dist"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}
Run Code Online (Sandbox Code Playgroud)

确保includetsconfig.json 中的文件夹包含使用顶级等待的打字稿:

npx tsc
Run Code Online (Sandbox Code Playgroud)

dist/runme.mjs已生成并且我编译的应用程序运行。

解决方案 3:使用更好的工具,例如esrun

esrun是一个更新的工具,不仅仅是在没有事先设置的情况下运行ts文件。与 、tsc等不同,esrun:ts-nodetsx

  • 不需要tsconfig.json
  • 不需要package.json
  • 支持顶级await
  • 不会给出愚蠢的错误消息(比如 ts-node 说它不支持运行 ts 文件)
npm i esrun
Run Code Online (Sandbox Code Playgroud)

然后只需:

npx esrun file.ts
Run Code Online (Sandbox Code Playgroud)

无需其他设置。


Bib*_*bek 8

您可以将 const 帐户的代码包装在异步函数中,因为您的目标选项不支持顶级等待。

 const account = async () => {
        await stripe.accounts.create({
          type: "express",
  });
};
Run Code Online (Sandbox Code Playgroud)

这取决于您的代码是要返回某些内容还是要在 await 之后执行其他一些任务。

如果你想使用顶级等待,更多关于使用顶级等待是在/sf/answers/3961327331/

  • **这是一种解决方法,向用户展示如何避免使用顶级等待,而不是答案**。正如错误提到的,如果“tsconfig.json”选项正确,您应该能够使用错误提到的顶级等待(即没有包装器异步函数)。 (39认同)
  • 我看不出这是如何相关的,因为它产生了一个承诺,因此这与删除“await”相同,或者我错过了一些东西? (5认同)
  • @SugarMouse你没有错过任何东西。事实上,这个答案很糟糕,不应该投票,因为它没有解决任何问题。你也可以只做 `const createPromise = stripe.accounts.create(...)` 这是同样的事情,但没有包装器。 (4认同)