带有承诺的编译错误

时间:2018-07-18 14:33:23

标签: typescript

编译该文件时,出现以下错误:

  

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);
    });
  }
}

2 个答案:

答案 0 :(得分:2)

IFighter界面中更改您的名字:

这一个knockout: () => Promise<Promise<any>>;

knockout: () => Promise<any>;

Promise<Promise<Promise<...<T>>>>没有意义,因为无论如何它将被表示为Promise<T>

答案 1 :(得分:2)

您具体遇到的错误可能是由于您定位了es5es5没有内置的承诺。在es5打字稿库中定义了一个Promise类型,但是没有一个Promise构造函数。如果您的运行时具有Promise构造函数,或者您拥有一个polyfill,则可以在lib上添加一个tsconfig.json属性,以告知打字稿添加承诺的定义(完整的{ {1}}符合承诺)。

es2015

编辑,如@Oleksii指出,{ .... "lib": ["es5","es2015.promise","dom", "scripthost"] .... } 应该为knockout: () => Promise<Promise<any>>;,但这与问题中的错误没有特别关系。