在流动结构亚型可能会导致信息丢失:流的信息损失与这种多态性固有的结构分型有关吗?
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)
(。这段代码是可怕的,因为它执行可见突变只用于说明目的)
我读过该行多态性是一种避免信息丢失而不危害型安全的概念。
有没有办法实现与亚型多态性一样吗?
[编辑]
为了应对更大的观众我公司提供的有些吓人术语的简要说明:
- Polymorpishm仅仅是一个奇特的词语,以确定如果两个类型等效的,即它使刚性型系统更灵活
- 参数多态(在流泛型)指出,两种类型是始终相当于,因为类型并不在所有问题
- 亚型多态性(子类型的流量)指出,两种类型是等价的,如果你可以从他们那里获得一个层次,即归入其超
- 行多态性下的亚型类似于亚型,但解决了信息丢失的问题(在技术上,然而,没有亚型的关系了,所以它不是子类型的一种形式)
- 界多态性指出两种等价为特定目的只有,例如平等,秩序,映射等
为什么我的函数问题?它只是依赖于子类型的承诺,人们可以在一个亚型通过无论其超预期。你的建议是使用有界多态,相反,这只是意味着子类型不如其他形式的多态 - 至少在某些情况下以及实现可靠算法所需的复杂性。 – ftor
@ftor我明白你在说什么,看起来它应该工作,但是对于你所说的函数,你说它明确地寻找O类型的参数,而不是O类型的参数或O的子类型。指定参数是你告诉编译器,你期待一个参数类型O或子类型O.查看Java如何处理它https://softwareengineering.stackexchange.com/questions/227918/java-use-polymorphism-or-bounded -type-parameters –
kyle
@ftor检查我更新的答案,因为它更好地解释了我以前的评论和OOP,但在流程的上下文中。 – kyle