ts ES5/ES3 中的异步函数或方法需要 'Promise' 构造函数

Posted

技术标签:

【中文标题】ts ES5/ES3 中的异步函数或方法需要 \'Promise\' 构造函数【英文标题】:ts An async function or method in ES5/ES3 requires the 'Promise' constructorts ES5/ES3 中的异步函数或方法需要 'Promise' 构造函数 【发布时间】:2017-09-19 04:53:56 【问题描述】:

您好,我在我的 TypeScript 项目中使用 async/await,但我得到了这个日志:

[ts] ES5/ES3 中的异步函数或方法需要“Promise”构造函数。确保您有“Promise”构造函数的声明或在您的 --lib 选项中包含“ES2015”。

我该如何解决?

【问题讨论】:

【参考方案1】:

如错误消息所述,将 lib: es2015 添加到您的 tsconfig.json 中

// tsconfig.json

  "compilerOptions": 
    "lib": [ "es2015" ]
  

更新:如果这不适合你,试试这个:

JetBrains IDE,例如 WebStorm,默认使用自己的实现。确保将其配置为使用 TypeScript 语言服务。

对于 Visual Studio,项目文件和tsconfig.json 是互斥的。您将需要直接配置您的项目。

https://github.com/Microsoft/TypeScript/issues/3983#issuecomment-123861491

【讨论】:

"compilerOptions": "module": "commonjs", "target": "es5", "noImplicitAny": false, "sourceMap": false 这是我的 tsconfig.json 我应该如何编辑? @katopz 我做了,但是VS不关心它,我发现csproj文件有一些额外的xml元素来启用/禁用这些东西。 我必须重新启动我的 IDE (WebStorm) 才能看到结果。 我有那个 ("lib": ["dom", "es2015"]) 但它仍然抱怨 我必须将"dom" 也包含在"lib" 数组中,否则会出现其他错误。【参考方案2】:

试试这个包含 es6-promise 类型定义的包

npm install --save @types/es6-promise

【讨论】:

如果你的目标是节点,npm i -D @types/node@16 也可以。【参考方案3】:

如果你在 VS 上,删除 tsconfig.json 并在解决方案资源管理器中右键单击项目,然后单击 Properties->TypeScript Build in General 更改以下内容

ECMAScript 版本:ECMAScript 6

模块系统:ES2015

【讨论】:

@LukePighetti 解决方案资源管理器中的项目【参考方案4】:

我在 Angular 4 项目中使用 VS2017 v15.8.2 和 Typescript 2.4.2(在我的解决方案中的类库项目下,而不是 typescript 项目下)。 通过禁用 JavaScript 语言服务,我能够消除 VS 中的错误/警告:

选项 => 文本编辑器 => JavaScript/TypeScript => 语言服务

重启VS。

希望这会有所帮助。

【讨论】:

【参考方案5】:

您也可以使用 "lib": "es2015.promise" 来解决该特定错误

【讨论】:

【参考方案6】:

VS2019 似乎无法识别 tsconfig.json 文件,因此 LIB 选项不会更改应用程序。这是一种为 typescript 添加 PROMISE 以接受 ASYNC AWAIT 的方法。

export function AD(first: any, second: any, callBack: any)

    const rtn = async (dispatch: any): Promise<void> =>
    
        await axios.post(TYPE.URI,  // provide a string of a URI to post into
            parm1: first,
            parm2: second
        )
            .then(data => // or you can use response instead of data as a name
            
                console.log("data from call next");
                console.log(data);
                dispatch( type: TYPES.AD, payload: data.data );
                if (callBack)
                
                    callBack(data);
                
            )
    
    return rtn;


【讨论】:

【参考方案7】:

对我来说,错误发生在src/tests 文件夹内的测试文件中。由于我使用ts-node 直接测试.ts 文件,因此我在tsconfig.json 中排除了src/tests/*。一旦我删除了该行,错误就消失了(这最终是有道理的)。

以防其他人在他的测试文件中遇到这个问题。

编辑:当然,您需要按照接受的答案中的概述正确配置 --lib 选项。我的tsconfig.json --lib 选项的作用如下:

"lib": [
    "es2018",
    "dom"
]

【讨论】:

【参考方案8】:

我终于设法解决了! 我在终端上的命令: yarn tsc main.ts &amp;&amp; nodejs main.js 我的错误信息:

main.ts:1:16 - 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 main() 
                 ~~~~


Found 2 errors.

error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我解决这个问题的方法是引用 tsconfig.json 文件。 我的 tsconfig.json 文件是这样的:


    "compilerOptions": 
        "target": "ESNext",
        "lib": [
            "ES2015",
            "DOM"
        ]
    

我的终端命令是这样的: yarn tsc -p ./tsconfig.json &amp;&amp; nodejs main.js 如果我想运行其他 .ts 文件,我只需这样做: yarn tsc -p ./tsconfig.json &amp;&amp; nodejs file_name.js

【讨论】:

【参考方案9】:

tsc --target ES6

这就是我的解决方案!

【讨论】:

【参考方案10】:

在 tsconfig.json 中添加“es2015.promise” - 在“lib”中 = 像这样:


    "compilerOptions": 
        "target": "es5",
        "lib": [
            "es5",
            "dom",
            "es2015.promise"
        ],
        "types": [
            "mocha"
        ],
        "module": "commonjs",
        "outDir": "../../../out",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "sourceMap": true,
        "declaration": true
    ,
    "exclude": [
        "node_modules",
        "dist",
        "tests"
    ]

【讨论】:

【参考方案11】:

在我的例子中,我只是不小心删除了函数中的“return”语句,并且在我把它放回去之前一直显示这个错误。

【讨论】:

【参考方案12】:

当您通过tsc index.ts --watch 编译或查看您的打字稿文件时,将--lib 标志添加到它的值(在我们的例子中为es2015),它应该看起来像这样tsc index.ts --watch --lib es2015 为了更好地工作tsc index.ts --watch --lib "es2015, es2016, dom" - 当它无法从 tsconfig.json 读取 dom 时

【讨论】:

以上是关于ts ES5/ES3 中的异步函数或方法需要 'Promise' 构造函数的主要内容,如果未能解决你的问题,请参考以下文章

错误:类型不是 ES5/ES3 中的有效异步函数返回类型,因为它没有引用与 Promise 兼容的构造函数

如何在 TypeScript 中定位 ES2018?

NodeJS 在异步函数(async/await)中调用栈打印不全的问题

Jest 使用指南 - - ts 文件篇

Jest 使用指南 - - ts 文件篇

Jest 使用指南 - - ts 文件篇