NodeJS Typescript编译问题(错误TS 2705-ES 2015--lib选项)

voj3qocg  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(447)

bounty还有6天到期。回答此问题可获得+50声望奖励。Wojtek Dmyszewicz想要引起更多关注这个问题:如果答案能带来更好的错误处理,或者解释了--lib选项所指的位置,我会很高兴。

当用tsc -p .编译typescript文件时,我得到以下错误
错误TS 2705:ES 5/ES 3中的异步函数或方法需要'Promise'构造函数。确保你有一个'Promise'构造函数的声明,或者在'--lib'选项中包含'ES 2015'。
9异步函数fetchImages(param 1:string):Promise<string[]> {
使用lib选项tsc --lib es5进行编译并不能解决这个问题
谁能解释一下--lib选项,以及它是如何修复它的,因为它在我的例子中没有。
还是错误指向了另一个lib选项?

node -v
v19.9.0

tsc -v                    
Version 5.1.0-dev.20230512

tsconfig:

{
  "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. */
  }
}
flvlnr44

flvlnr441#

如前所述,您的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"]];
        });
    });
}

编译器正在对awaitergenerators进行匀场,这两个文件在ES6之前都不可用。注意这里没有PromiseGenerator类型。
将您的target更改为es6,其中添加了原生Promise支持,可以解决此问题。编译后的JS看起来像这样:

function doWork() {
    return __awaiter(this, void 0, void 0, function* () {
        return ["a", "b", "c"];
    });
}

您可以在这里看到发出的原生Generatorfunction*)。
总之,您的目标是ES5,它没有原生Promise支持,因此使用该类型会出现错误。解决方案是提供一个Promise兼容的实现或使用ES6
但是,如果你真的在写一个Node 19应用程序,你可能应该使用完全不同的编译器选项。

相关问题