我有以下代码:
function asyncFunc1(): Promise<string> {
return new Promise<string>(x => x);
}产生以下错误:
TS2304:找不到名字“承诺”
因此,我将其改为明确声明“承诺”:
///<reference path="../typings/modules/bluebird/index.d.ts" />
import * as Promise from 'bluebird';
function asyncFunc1(): Promise<string> {
return new Promise<string>(x => x);
}现在我得到了以下错误:
TS2529:重复标识符“承诺”。编译器在包含异步函数的模块的顶级作用域中保留名称“允诺”
我怎样才能解决这个矛盾呢?
发布于 2016-10-13 16:04:28
承诺仅在ES6中可用
如果将目标设置为ES6,类型记录编译器将使用不同的基库对语言规范中包含的类型进行基本类型检查。确保你的目标是ES6。
在TypeScript中没有针对ES6的承诺
如果您希望访问在es2015规范中定义的构造函数的定义,这些方法是由浏览器和NodeJS (通过V8引擎)在语言特性(如箭头函数、析构等)之前实现的,那么您可以这样做。
您要做的是将TypeScript配置为目标es5,而不是包含和默认库,并自己引用默认库。
您的tsconfig可能如下所示:
{
"compilerOptions: {
"noLib": true,
"target": "ES5",
}
"files": [
"node_modules/typescript/lib/lib.es6.d.ts",
"app.ts",
]
}以上示例假设类型记录直接安装在项目中。如果不是,则始终可以从您的类型记录安装文件夹中复制,并将其包含在您的项目中。
这个解决方案应该为允诺构造函数提供类型,以及各种其他特性,如array.includes()和其他一些功能。这样做的不利之处在于,对于没有在浏览器中实现的东西,您不会得到类型错误,但是如果您使用的是“承诺”,那么您可能只针对现代浏览器,或者使用Node来控制运行时环境。
发布于 2016-10-12 21:34:13
TypeScript似乎正在保护承诺标识符。尝试将导入作为承诺以外的名称,或者使用另一组类型。在这个TypeScript GitHub问题中有一些建议。
问题是使用不同的具有异步等待的承诺库,但这种情况很可能是他们保护承诺名称的原因。具体来说,当我们在TypeScript中使用异步/等待时,编译器会将其转换为发出的代码中的承诺,因此编译器试图保护允诺构造函数不被重写。您总是可以用这种方法来欺骗编译器,但是一定要问问自己,这样做是否正确。
https://stackoverflow.com/questions/39958914
复制相似问题