TypeScript Promise TS2304 TS2529

Alo*_*lon 6 javascript promise typescript

我有以下代码:

function asyncFunc1(): Promise<string> {
    return new Promise<string>(x => x);
}
Run Code Online (Sandbox Code Playgroud)

这产生了以下错误:

TS2304:找不到名字'承诺'

所以我把它改为明确声明'Promise':

///<reference path="../typings/modules/bluebird/index.d.ts" />

import * as Promise from 'bluebird';

function asyncFunc1(): Promise<string> {
    return new Promise<string>(x => x);
}
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

TS2529:重复标识符'Promise'.编译器在包含异步函数的模块的顶级范围内保留名称"Promise"

我怎样才能解决这个悖论?

nbe*_*ing 4

Promise 仅在 ES6 中可用

如果将目标设置为 ES6,TypeScript 编译器将使用不同的基础库来针对语言规范中包含的类型进行基本类型检查。确保您的目标是 ES6。

TypeScript 中的 Promise 不针对 ES6

如果您想访问 es2015 规范中定义的构造函数定义,这些方法在语言功能(如箭头函数、解构等)之前已由浏览器和 NodeJS(通过 V8 引擎)实现,您可以这样做。

您想要做的是将 TypeScript 配置为以 es5 为目标,而不是包含和默认库,并自己引用默认库。

你的 tsconfig 可能看起来像这样:

{
  "compilerOptions: {
    "noLib": true,
    "target": "ES5",
    }
   "files": [
     "node_modules/typescript/lib/lib.es6.d.ts",
     "app.ts",
   ]
}
Run Code Online (Sandbox Code Playgroud)

上面的示例假设 typescript 直接安装在您的项目中。如果不是,您可以随时从打字稿安装文件夹中复制并将其包含在您的项目中。

这个解决方案应该为您提供 Promise 构造函数的类型,以及各种其他功能,例如 array.includes() 和其他一些东西。这样做的缺点是,对于浏览器中未实现的内容,您不会遇到类型错误,但如果您无论如何都使用 Promise,那么您可能只针对现代浏览器,或者您在您控制的地方使用 Node运行时环境。