编译该文件时,出现以下错误:
44:16-错误TS2693:'Promise'仅指一种类型,但在此处被用作值。
fighter.ts:44:14 - error TS2693: 'Promise' only refers to a type, but is being used as a value here.
44 return new Promise((resolve) => {
在这种情况下如何正确描述Promise
?
export interface IFighter {
_name: string;
_health: number;
_power: number;
health: () => number;
name: () => string;
setDamage: (damage: number) => void;
hit: (enemy: Fighter, point: number) => void;
knockout: () => Promise<Promise<any>>;
}
export class Fighter implements IFighter {
_name: string;
_health: number;
_power: number;
constructor(name: string, health: number, power: number) {
this._name = name;
this._health = health;
this._power = power;
}
health(): number {
return this._health;
}
name(): string {
return this._name;
}
setDamage(damage: number): void {
this._health = this._health - damage;
console.log(`${this._name} got ${damage} dmg. ${this._health}hp less`);
}
hit(enemy: Fighter, point: number): void {
let damage: number = point * this._power;
enemy.setDamage(damage);
}
knockout(): Promise<any> {
return new Promise((resolve) => {
console.log("time is over");
setTimeout(() => {
resolve((): void => {});
}, 500);
});
}
}
答案 0 :(得分:2)
在IFighter
界面中更改您的名字:
这一个knockout: () => Promise<Promise<any>>;
到knockout: () => Promise<any>;
写Promise<Promise<Promise<...<T>>>>
没有意义,因为无论如何它将被表示为Promise<T>
答案 1 :(得分:2)
您具体遇到的错误可能是由于您定位了es5
。 es5
没有内置的承诺。在es5
打字稿库中定义了一个Promise类型,但是没有一个Promise构造函数。如果您的运行时具有Promise
构造函数,或者您拥有一个polyfill,则可以在lib
上添加一个tsconfig.json
属性,以告知打字稿添加承诺的定义(完整的{ {1}}符合承诺)。
es2015
编辑,如@Oleksii指出,{
....
"lib": ["es5","es2015.promise","dom", "scripthost"]
....
}
应该为knockout: () => Promise<Promise<any>>;
,但这与问题中的错误没有特别关系。