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

29

在我的项目中,我使用的是Typescript@4.0.3,一切都很正常,但现在我将其版本更新为最新的Typescript@4.1.3,结果出现了许多错误。我无法在文档中找到任何信息,也不知道如何解决这个问题。

以下是我的代码:

abstract class SystemValidator {

    constructor() {}

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

这给我报错了:

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

有什么解决方法吗??我应该从这里删除 async 吗?

2个回答

41

是的,你应该删除 async

不应该强制让实现它的类使用 async。还有其他返回 Promise 的方式,不只是 async

编辑:

由于有些人不清楚为什么 async 不重要,这里列出了几种返回 promise 的方式:

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

玩耍链接


13
他应该强制实现它的类返回他需要返回的内容。事实上,TypeScript 在这方面有一定限制。应该允许 TypeScript 使抽象方法具有 async 修饰符,如果开发人员打算这样做的话。 - oxygen
4
没错,接口或抽象类可以要求返回任何您想要的内容,而 async 修饰符与此无关。 - distante
13
当然有影响。它将任何返回值转换为Promise并通知函数的用户一个Promise已被返回,这是JavaScript基础知识。async修饰符只与返回有关,与其他任何内容无关。如果开发人员仅为了代码可读性而强制执行它,并不想被迫返回新的Promise(),那么使用async是透明和自动的,他应该被允许这样做。 - oxygen
2
仅仅因为你可以不使用async,这并不意味着它会使代码更易读。少并不代表更多。许多编程语言允许在接口中强制执行冗余修饰符,以减少错误,并在库更改后简化重构(即使只是视觉上的帮助)。例如,Swift允许程序员强制对接口函数进行命名参数,以便调用者在调用时必须命名参数。我会强制执行async修饰符,仅仅是为了代码可读性(或者仅仅是为了一致性,以确保通过项目的ctrl+F可以使用简单的关键字)。 - oxygen
1
只要函数的 return 符合 interface/abstract 函数签名所需求的,你可以重构任何你想要的东西。无论如何,欢迎你为 Typescript 团队创建一个功能请求,以允许在 abstract/interface 函数上使用 async。也许你是对的,而 Typescript 团队是错的。 - distante
显示剩余3条评论

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,在这种情况下,async是多余的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接