是否存在TypeScript编译选项可禁止子类方法移除父类参数可选性?
问题根因
你遇到的是典型的里氏替换原则违反场景:子类重写父类方法时收窄了参数的可选范围,父类允许省略第二个参数的合法调用,在子类实例上运行时就会触发空值异常。
对应的TS编译配置方案
开启以下两个TS编译选项即可实现这类问题的前置检测:
- 开启
noImplicitOverride:该选项要求所有重写父类的方法必须显式添加override关键字,避免无意识重写,同时触发TS对重写方法的签名兼容性校验。 - 开启
strictFunctionTypes(如果已经开启strict: true则该选项默认生效):该选项会收紧函数类型的兼容性校验规则,要求方法参数遵循逆变原则——子类重写方法的参数只能比父类更宽松,不能更严格。
开启上述选项后,你示例中的Subclass类的thing方法会直接抛出编译错误,提示重写的签名和父类不兼容,不需要等到运行时才发现问题。
推荐修复方案
如果业务逻辑上子类的thing方法确实要求必须传入player参数,应该优先调整父类的方法签名,不要把player设为可选;如果父类的签名不能修改,则子类重写时需要保留参数的可选性,自行做空值判断:
class Subclass extends Base { public override thing(attribute: Attr, player?: Player) { if (!player) { // 自行处理缺省逻辑,比如抛出业务异常、打日志兜底等 throw new Error('调用Subclass.thing必须传入player参数') } player.something() } }
内容的提问来源于stack exchange,提问作者kberg
相关产品推荐
相关产品推荐

