错误 TS1243:“async”修饰符不能与“abstract”修饰符一起使用

error TS1243: 'async' modifier cannot be used with 'abstract' modifier

提问人:Naila Akbar 提问时间:12/18/2020 更新时间:11/17/2023 访问量:22535

问:

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

这是我的代码:

abstract class SystemValidator {

    constructor() {}

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

}

这给了我错误:

错误 TS1243:“async”修饰符不能与“abstract”修饰符一起使用。

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

TypeScript 异步 抽象类

评论


答:

42赞 distante 12/18/2020 #1

是的,您应该删除 .async

不应强制使用实现它的类。还有其他方法可以返回 ,而不仅仅是 。asyncPromiseasync

编辑:

因为有些人不清楚为什么这不重要。以下是返回 promise 的几种方法: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();

Playground 链接

评论

13赞 oxygen 12/19/2020
应该强制实现它的类返回他需要返回的任何内容。事实上,TypeScript 仅限于此。应该发生的事情是,如果这是开发人员的意图,TypeScript 必须允许带有抽象的 async 修饰符。
4赞 distante 12/19/2020
你说了。接口或抽象类可以要求返回您想要的任何内容,修饰符与此无关。async
13赞 oxygen 12/20/2020
当然可以。它将任何返回转换为 Promise,并通知用户保证返回 promise 的函数。这就是 JavaScript 101。async 修饰符只与返回值有关,与其他任何内容无关。如果开发人员只是为了代码可读性而想强制执行它,而不是被迫返回新的 Promise(),它实际上是透明的和自动的,并且具有异步,那么他应该被允许这样做。
2赞 oxygen 7/28/2021
仅仅因为你可以取消异步,并不意味着它使代码更具可读性。少即是多。许多语言允许在接口中强制使用冗余修饰符,特别是为了降低错误发生的可能性,并简化库更改后的重构(即使它只是视觉帮助)。例如,Swift 允许程序员为接口函数强制使用命名参数,以便调用者在调用时必须命名参数。我会强制使用 async 修饰符只是为了代码可读性(或者只是为了保持一致性,以确保 ctrl+F 通过项目可以使用简单的关键字)。
1赞 distante 8/13/2021
你可以折射你想要的一切,只要函数的返回是 / 函数签名所需要的。无论如何,欢迎您为 Typescript 团队创建一个功能请求,以允许 on / 功能。也许你是对的,而 Typescript 团队是错的。interfaceabstractasyncabstractinterface
1赞 fabda01 11/17/2023 #2

您只需从声明中删除关键字,并在实现中仍然使用。asyncasync

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 上找到的这个解释

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