如何在 TypeScript 中要求符合 Liskov 标准的重载?

How to require Liskov-compliant overloads in TypeScript?

the following setup:

class Base {
    doSomething(value: unknown): void {}
}

class Child extends Base {
    override doSomething(): void {}
}

…我预计会出现编译器错误,与 ChilddoSomething 重载中缺少的 value: unknown 参数相关,因为违反了 LSP,但那里没有这样的错误(如在操场上看到的那样)。

有没有办法强制 Child.doSomething() 扩展到 Base.doSomething(),而不是完全覆盖它?

稍微简化的示例:


let base = (value: unknown) => { }

let child = () => { }

base = child

base(42) // ok

child 分配给 base 是安全的。使用参数 base(42) 调用 base 不应提供任何不安全的行为或错误,因为它实际上调用 child 不需要任何参数。

另一方面,将 child 赋给 base 是不安全的:

let base = (value: unknown) => {
    console.log(value)
}

let child = () => { }

child = base // error

child()

TS 禁止您将 base 分配给 child,因为 base 需要一些参数并且调用 child 而不带参数可能会导致运行时错误。

有关函数​​可分配性的更多信息,您可以在 docs

中找到