我有以下代码:
function asyncFunc1(): Promise<string> {
return new Promise<string>(x => x);
}
产生了以下错误:
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);
}
现在我收到以下错误:
TS2529:重复标识符'承诺'。编译器保留名称 在包含异步函数的模块的顶级范围内“承诺”
我该如何解决这个悖论?
答案 0 :(得分:4)
如果将目标设置为ES6,则typescript编译器使用不同的基本库来针对语言规范中包含的类型进行基本类型检查。确保您的目标是ES6。
如果您希望访问构造函数的定义作为es2015规范中定义的方法,这些方法已经由浏览器和NodeJS(通过V8引擎)在语言功能(如箭头函数,解构等)之前实现 - 您可以这样做。 / p>
您要做的是将TypeScript配置为目标es5,而不是include和默认库,并自己引用默认库。
您的tsconfig可能如下所示:
{
"compilerOptions: {
"noLib": true,
"target": "ES5",
}
"files": [
"node_modules/typescript/lib/lib.es6.d.ts",
"app.ts",
]
}
以上示例假定typescript直接安装在您的项目中。如果不是,您可以随时从您的打字稿安装文件夹中复制并将其包含在您的项目中。
此解决方案应该为您提供Promise构造函数的输入,以及各种其他功能,如array.includes()和其他一些功能。这有一个缺点,你不会因为浏览器中没有实现的东西而出现类型错误,但是如果你使用Promise,你可能只是针对现代浏览器,或者你正在使用你控制的Node运行时环境。
答案 1 :(得分:1)
似乎TypeScript正在保护Promise标识符。尝试导入除Promise之外的名称,或使用一组不同的类型。这个TypeScript GitHub问题中有一些建议。
Async / await with Bluebird promises
问题在于使用Async Await使用不同的promise库,但这种情况很可能是他们保护Promise名称的原因。具体来说,当我们在TypeScript中使用Async / Await时,编译器会将其转换为发出代码中的Promise,因此编译器会尝试保护Promise构造函数不被覆盖。你总是可以用这种东西欺骗编译器,但一定要问问自己这是否正确。