使用
tsc -p .
编译打字稿文件时出现以下错误
错误 TS2705:ES5/ES3 中的异步函数或方法需要 “承诺”构造函数。确保你有一份声明 “承诺”构造函数或在“--lib”选项中包含“ES2015”。
9 异步函数 fetchImages(param1: string): Promise
{
使用 lib 选项编译
tsc --lib es5
没有解决它
最终通过将“@types/node”:“^20.1.3”添加到我的依赖项来修复它,但是有人可以解释更多关于 --lib 选项的信息以及如何修复它,因为它没有我的情况。
或者错误是指不同的 lib 选项?
node -v
v19.9.0
tsc -v
Version 5.1.0-dev.20230512
ts配置:
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */
/* Language and Environment */
"target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
/* Modules */
"module": "es6", /* Specify what module code is generated. */
"rootDir": ".", /* Specify the root folder within your source files. */
"baseUrl": ".", /* Specify the base directory to resolve non-relative module names. */
/* Emit */
"sourceMap": true, /* Create source map files for emitted JavaScript files. */
"outDir": "dist", /* Specify an output folder for all emitted files. */
/* Interop Constraints */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
/* Completeness */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}
如前所述,您的
tsconfig.json
设置并不适合 Node 19 项目(通常也可能不适合 Node 项目)...
但是,准确地说,您的问题有点微妙。考虑以下几点:
{
"compilerOptions": {
"rootDir": "src/",
"listFiles": true,
"module": "es6",
"skipLibCheck": true,
"target": "es5",
},
}
async function doWork() : Promise<string[]> {
return null;
}
$ tsc
index.ts:1:27 - error TS2705: An async function or method in ES5/ES3 requires the 'Promise' constructor. Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option.
1 async function doWork() : Promise<string[]> {
~~~~~~~~~~~~~~~~~
确切的原因是,直到
Promise
又名 ES6
,而不是 ES2015
,才引入原生 ES5
支持,尽管 async
可用。
尝试从函数中删除返回类型:
async function doWork() {
return ["a", "b", "c"]
}
有趣的是,这段代码可以编译。如果您查看转译后的 JS,它看起来像这样:
function doWork() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, ["a", "b", "c"]];
});
});
}
编译器正在填充
awaiter
和 generators
,它们在 ES6
之前也不可用。注意这里没有Promise
或Generator
类型。
将您的
target
更改为 es6
,其中添加了原生 Promise 支持可解决此问题。转译后的 JS 看起来像这样:
function doWork() {
return __awaiter(this, void 0, void 0, function* () {
return ["a", "b", "c"];
});
}
这里可以看到原生的
Generator
(function*
)正在发射
总之,您的目标是
ES5
没有原生 Promise
支持,因此使用该类型会出现错误。解决方案是要么提供一个 Promise
兼容的实现,要么使用 ES6
.
但是,如果您真的在编写 Node 19 应用程序,您可能应该无论如何都使用完全不同的编译器选项。