流中的结构子类型化可能会导致信息丢失:
type O = {x: number, y: number};
type P = {x: number, y: number, z: number}
function f(o: O) {
return o.x * 2, o.y * 2, o;
}
const p: P = {x: 2, y: 3, z: 100};
const r = f(p);
r.z // type error (property not found)
(这段代码很糟糕,因为它执行可见的突变。它仅用于说明目的。)
我已经读过行多态性是一个在不危及类型安全的情况下避免这种信息丢失的概念。
有没有办法通过亚型多态性实现相同的目标?
[编辑]
为了让更多的观众看到,我对这个有点吓人的术语做一个简短的解释:
- Polymorphishm只是一个花哨的词,用于确定两种类型是否等价,即它使刚性类型系统更加灵活
- 参数多态性(流中的泛型)表明两种类型总是等价的,因为类型根本不重要
- 子类型多态性(流中的子类型)表明,如果您可以从中派生层次结构,则两种类型是等价的,即将子类型包含在其超类型下
- 行多态性类似于子类型,但解决了信息丢失问题(但是从技术上讲,不再存在子类型关系,因此它不是子类型的一种形式)
- 有界多态性表明两种类型仅在特定目的下是等价的,例如相等、顺序、映射等。