如何在 TypeScript 中要求符合 Liskov 标准的重载?
How to require Liskov-compliant overloads in TypeScript?
class Base {
doSomething(value: unknown): void {}
}
class Child extends Base {
override doSomething(): void {}
}
…我预计会出现编译器错误,与 Child
的 doSomething
重载中缺少的 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
中找到
class Base {
doSomething(value: unknown): void {}
}
class Child extends Base {
override doSomething(): void {}
}
…我预计会出现编译器错误,与 Child
的 doSomething
重载中缺少的 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
中找到