Typescript 编译问题(错误 TS2705 - ES2015 --lib 选项)

问题描述 投票:0回答:1

使用

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. */
  }
}
node.js typescript node-modules tsconfig
1个回答
1
投票

如前所述,您的

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 应用程序,您可能应该无论如何都使用完全不同的编译器选项。

© www.soinside.com 2019 - 2024. All rights reserved.