即使使用正确的 tsconfig,ts-jest 也无法使用顶级等待

Pay*_*ian 9 node.js typescript jestjs ts-jest

我正在尝试在 Jest 测试期间使用顶级等待,但 Jest 抱怨说

\n
error TS1378: 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.\n
Run Code Online (Sandbox Code Playgroud)\n

这是有问题的文件 ( src/lib/mongodb.ts):

\n
import { MongoClient } from \'mongodb\';\nimport mongoUri from \'mongo-uri-tool\';\nimport { getMongoURI } from \'./settings/settings.js\';\n\nconst getConnectionOptions = () => {\n  const uri = getMongoURI();\n\n  return {\n    uri,\n    parsedUri: mongoUri.parseUri(uri),\n  };\n};\n\nconst connectToMongoDB = async () => {\n  const connectionOptions = getConnectionOptions();\n\n  const mongodb = await MongoClient.connect(connectionOptions.uri);\n\n  return mongodb.db(connectionOptions.parsedUri.db);\n};\n\nexport const MongoDB = await connectToMongoDB();\n
Run Code Online (Sandbox Code Playgroud)\n

这是src/api/trips/trips.test.ts最终导入上述内容的测试()文件:

\n
import { Trips } from \'./index\'; // <--------- this is the import which leads to importing mongodb\nimport generateId from \'../../lib/generateId\';\n\ndescribe(\'find trip by id\', () => {\n  test(\'find trip by id\', async () => {\n    const id = generateId();\n    const slug = \'lol\';\n    await Trips.insertOne({ _id: id, slug });\n\n    const trip = await Trips.findOne({ _id: id });\n    expect(trip._id).toStrictEqual(id);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行时npx tsc没有报告任何问题:

\n
11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xae\xe2\x9d\xae\xe2\x9d\xae npx tsc\n11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的tsconfig.json,其中包含正确的moduletarget

\n
{\n    "compilerOptions": {\n      "sourceMap": true,\n      "esModuleInterop": true,\n      "allowJs": true,\n      "noImplicitAny": true,\n      "moduleResolution": "node",\n      "lib": ["es2022", "DOM"],\n      "module": "es2022",\n      "target": "es2017",\n      "rootDir": "src",\n      "baseUrl": ".",\n      "paths": {\n        "*": ["node_modules/*", "src/types/*"]\n      },\n      "types": ["node", "jest"],\n      "typeRoots": ["node_modules/@types", "src/types"],\n      "outDir": "./built"\n    },\n    "include": ["./src/**/*", "jest.config.js"],\n    "exclude": ["node_modules", "dist"]\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的jest.config.cjs

\n
const { jsWithTsESM: tsjPreset } = require("ts-jest/presets");\n\nmodule.exports = {\n  ...tsjPreset,\n  globals: {\n    "ts-jest": {\n      tsconfig: "tsconfig.json",\n    }\n  },\n  testEnvironment: \'node\',\n  moduleFileExtensions: ["ts", "js"],\n  testRegex: ".*.test.ts"\n};\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的项目结构:

\n

在此输入图像描述

\n

为什么 Jest 和 ts-jest 抱怨我无法使用顶级等待,但tsc我的 IDE (Webstorm) 根本不抱怨?如何正确配置 Jest 和 ts-jest 以允许对 JS 和 TS 文件使用 ESM 进行顶级等待(我正在慢慢从 JS 迁移到 TS)?

\n

请注意,Jest 工作得很好,直到我添加了第一个依赖于顶级等待的测试。看来我已经正确配置了 Jest 和 ts-jest 来与 ESM 以及 JS 和 TS 文件的混合一起使用。新的问题是用 ts-jest 找出顶层的等待。

\n

编辑:如果我添加@ts-ignore到有问题的顶级等待,我会收到 Jest 报告的另一个类似问题:

\n
// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const MongoDB = await connectToMongoDB();\n
Run Code Online (Sandbox Code Playgroud)\n
    Details:\n\n    /Users/paymahn/code/tripvector/tripvector-mono/backend/src/lib/mongodb.ts:24\n    exports.MongoDB = await connectToMongoDB();\n                      ^^^^^\n\n    SyntaxError: await is only valid in async functions and the top level bodies of modules\n
Run Code Online (Sandbox Code Playgroud)\n

这可能是我使用的节点版本的问题吗?我目前使用的是 v17:

\n
11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xaf\xe2\x9d\xaf\xe2\x9d\xaf node --version\nv17.6.0\n11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xaf\xe2\x9d\xaf\xe2\x9d\xaf npm --version\n7.6.0\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:有趣的是,我迁移到摩卡并-n loader=ts-node/esm完美地执行摩卡。我想知道笑话是怎么回事...

\n