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

Nul*_*ter 14 abstract-class asynchronous typescript

在我的项目中,我正在使用Typescript@4.0.3并且运行良好,但现在我将其版本更新为最新Typescript@4.1.3它给了我很多错误。我无法在文档中找到任何内容,也没有任何想法如何解决此问题。

这是我的代码:

abstract class SystemValidator {

    constructor() {}

    abstract async validate(addr:Addr):Promise<[boolean, Addr[], SystemValidationErrors]>
Run Code Online (Sandbox Code Playgroud)

}

这给了我错误:

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

任何想法来解决这个问题?我应该aync从这里移除吗??

dis*_*nte 20

是的,您应该删除async.

您不应该强制使用async实现它的类。还有其他方法可以返回 a 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();

Run Code Online (Sandbox Code Playgroud)

游乐场链接

  • 当然可以。它将任何返回值转换为 Promise,并通知函数的用户保证返回一个 Promise。这就是 JavaScript 101。 async 修饰符只与返回有关,与其他任何事情无关。如果开发人员想要强制执行它只是为了代码可读性,而不是被迫返回 new Promise() ,这实际上是透明的并且是自动异步的,那么他应该被允许这样做。 (7认同)
  • 你说的。接口或抽象类可以要求**返回您想要的任何内容**,“async”修饰符与此无关。 (4认同)
  • 他“应该”强制实现它的类返回他需要返回的任何内容。事实上,TypeScript 仅限于这一点。应该发生的事情是 TypeScript 必须允许带有抽象的 async 修饰符(如果这是开发人员的意图)。 (3认同)
  • **仅仅因为您可以取消异步并不意味着它使代码更具可读性。少不等于多。**许多语言允许在接口中强制执行冗余修饰符,专门是为了减少出现错误的可能性并简化库更改后的重构(即使它只是一个视觉帮助)。例如,Swift 允许程序员强制接口函数命名参数,以便调用者在调用时**必须**命名参数。我强制使用 async 修饰符只是为了代码可读性(或者只是为了一致性以确保项目中的 ctrl+F 可以使用简单的关键字)。 (2认同)