TS 要求子类上的方法参数一致

问题描述 投票:0回答:0

我声明了一个抽象类,其中包含一个方法,其签名指定了一个参数

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 的预期行为,还是我配置错误的设置?是否存在子类方法实现应该具有与基类方法不同的参数的场景?如果它有故障,我可以修复它吗?

typescript oop interface abstract-class typescript-types
© www.soinside.com 2019 - 2024. All rights reserved.