【发布时间】:2020-02-03 16:41:08
【问题描述】:
我有以下代码:
type T = { foo: string }
var t: T = { foo: 'foo' }
interface S { foo: string }
var s: S = t
所以我们知道T < S。
这个怎么样?
t = s
好的,S < T 也是如此。
我们可以暗示S == T。
现在介绍U:
type U = { [key: string]: string }
var u: U = t
所以T < U。到目前为止一切顺利。
等一下!
u = s // Error!
这似乎违反了 Liskov 替换原则 (LSP):
如果 S 是 T 的子类型,则 T 类型的对象可以替换为 S 类型的对象
这是否违反了 LSP?有没有有关系吗?
抛开原则,这看起来相当愚蠢:
u = s // Error!
u = <T>s // Ok!
这会被认为是一个错误吗?编译器肯定可以自己完成,不是吗?
【问题讨论】:
标签: typescript liskov-substitution-principle