错误 TS1243:“异步”修饰符不能与“抽象”修饰符一起使用

问题描述 投票:0回答:2

在我的项目中,我使用的是

[email protected]
并且工作正常,但现在我将其版本更新到最新的
[email protected]
并且它给了我很多错误。我在文档中找不到任何内容,也不知道如何解决此问题。

这是我的代码:

abstract class SystemValidator {

    constructor() {}

    abstract async validate(addr:Addr):Promise<[boolean, Addr[], SystemValidationErrors]>

}

这给了我错误:

错误 TS1243:“异步”修饰符不能与“抽象”修饰符一起使用。

有什么办法可以解决这个问题吗?我应该从这里删除

aync
吗??

typescript asynchronous abstract-class
2个回答
40
投票

是的,您应该删除

async

您不应该强制在实现它的类中使用

async
。还有其他方法可以返回
Promise
,而不仅仅是
async

编辑:

因为有些人不清楚为什么

async
不重要。这里有几种返回承诺的方法:

async function iAmAsync(): Promise<boolean>{
    return false;
}

function iAmNotAsync(): Promise<boolean>{
 return new Promise(resolve => resolve(false));
}

function iAmAlsoNotAsync(): Promise<boolean>{
 return new Observable().pipe(first()).toPromise();
}

iAmAsync().then();
iAmNotAsync().then();

游乐场链接


0
投票

您可以简单地从声明中删除

async
关键字,并在实现中仍然使用
async

abstract class Shape {
  abstract area(): Promise<number>;
}

class Circle extends Shape {
  constructor(private radius: number) {
    super();
  }

  async area() {
    return Math.PI * Math.pow(this.radius, 2);
  }
}

(async () => {
  const circle = new Circle(5);
  console.log(await circle.area());
})();

如果你想知道为什么不需要它以及为什么它完全多余,我会参考我在 TypeScript Github 上找到的解释

async
修饰符唯一做的两件事是:1.使函数返回一个promise,2.允许在实现中使用
await
。由于抽象方法没有实现,并且您已经必须将其返回类型声明为
Promise<Whatever>
,因此
async
在这种情况下是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.