TypeScript从4.0.3升级到4.1.3后abstract与async同用报TS1243错误如何解决
升级TS4.1后抽象方法报TS1243错误的处理方案
报错本质
- 本次报错是TypeScript 4.1版本修复了此前的语法校验漏洞导致的,和原有业务逻辑无关:TS 4.0.3及更早版本没有拦截抽象方法上冗余的
async修饰符,代码可以正常通过编译;4.1版本严格按照语法规则校验,禁止抽象方法标记async,才触发了批量报错。 async是面向有具体函数体的实现方法的修饰符,作用是支持函数内部使用await、自动将返回值包裹为Promise。抽象方法仅作为类型签名存在,没有可执行的函数体,写async没有任何实际作用,属于冗余代码。
修复操作
直接移除抽象方法声明上的async修饰符,保留返回值的Promise类型标注即可,不会破坏类型兼容性。
修正后的代码:
abstract class SystemValidator { constructor() {} abstract validate(addr: Addr): Promise<[boolean, Addr[], SystemValidationErrors]> }
兼容性说明
- 上述调整完全不影响子类实现:子类重写
validate方法时,不管是使用async修饰符搭配await编写逻辑,还是直接手写返回Promise的普通函数,都和父类签名完全匹配,不存在类型不兼容问题。 - 项目内所有同类型的抽象方法
async修饰符都可以按这个规则批量移除,即可解决全部同类型报错,不需要修改TS编译配置。
内容的提问来源于stack exchange,提问作者Naila Akbar
相关产品推荐
相关产品推荐

