我声明了一个抽象类,其中包含一个方法,其签名指定了一个参数
context: StateMachine
abstract class State {
abstract enter(context: StateMachine): void
}
我希望 TypeScript 语言服务器要求子类实现也指定一致的参数。但是,当该方法在没有参数的情况下实现时,没有 VSCode IDE 警告出现,并且
tsc
成功编译。
class Idle extends State {
enter(): void { // <-- missing parameter, yet still works
...
}
}
这是有问题的,因为它允许状态的消费者尝试将
StateMachine
上下文(由接口指定)传递给可能无法实现接收它的方法。
class SomeContext extends StateMachine {
state: State
constructor(initialState: State) {
super(initialState)
}
update() {
this.state.enter(this) // <-- state might be Idle, doesn't take a context
}
}
据我所知,这违反了 Liskov 替换原则。有趣的是,上面的代码实际上并没有在运行时失败。
这是 TS 的预期行为,还是我配置错误的设置?是否存在子类方法实现应该具有与基类方法不同的参数的场景?如果它有故障,我可以修复它吗?