2

在流动结构亚型可能会导致信息丢失:流的信息损失与这种多态性固有的结构分型有关吗?

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仅仅是一个奇特的词语,以确定如果两个类型等效的,即它使刚性型系统更灵活
  • 参数多态(在流泛型)指出,两种类型是始终相当于,因为类型并不在所有问题
  • 亚型多态性(子类型的流量)指出,两种类型是等价的,如果你可以从他们那里获得一个层次,即归入其超
  • 行多态性下的亚型类似于亚型,但解决了信息丢失的问题(在技术上,然而,没有亚型的关系了,所以它不是子类型的一种形式)
  • 界多态性指出两种等价为特定目的只有,例如平等,秩序,映射等

回答

2

对于我已阅读关于Flowtype我很确定你的功能是问题。

如果你这样做,而不是:

function f<T: O>(o: T): T { 
    o.x *= 2; 
    o.y *= 2; 
    return o; 
} 

r.z; // okay 

这工作,因为有限的多态性。现在身体类型根据T是O的子类型的假设进行检查。此外,呼叫站点之间没有信息丢失。 Read more about it here.

另外,我没有听说过排多态性之前,让我去,并看着它。虽然看着它我看了几件事情,似乎表明该行多态性子类型。 123

为了扩大对这个答案并澄清为何有机磷农药功能不工作,但我提出了一个将正常工作。 T his is a nice reference as well but is specific to Java

通过具有该功能为:

function f(o: O) { 
    return o.x * 2, o.y * 2, o; 
} 

该函数指定它明确地寻找O型的对象,而不是的O的对象或O-的子类型是允许的。在OP函数中,我们将参数o向下转换为类型O,而不是使用泛型(这很糟糕)。来处理这个正确的方法是利用泛型指定它可以是类型O或O的亚型,其可如下进行:

function f<T: O> (o: T): T { 
    o.x *= 2; 
    o.y *= 2; 
    return o; 
} 

Check out the docs on how flow handles generics以及它是如何与功能参数,对象等。

相关部分是:

  • “泛型可以守住更具体的类型,同时增加了约束这样的泛型类型作为‘边界’。

  • “泛型有时让你在这样的参数类型传递给一个函数。这些被称为参数化泛型(或参数多态)。” link

+0

为什么我的函数问题?它只是依赖于子类型的承诺,人们可以在一个亚型通过无论其超预期。你的建议是使用有界多态,相反,这只是意味着子类型不如其他形式的多态 - 至少在某些情况下以及实现可靠算法所需的复杂性。 – ftor

+0

@ftor我明白你在说什么,看起来它应该工作,但是对于你所说的函​​数,你说它明确地寻找O类型的参数,而不是O类型的参数或O的子类型。指定参数是你告诉编译器,你期待一个参数类型O或子类型O.查看Java如何处理它https://softwareengineering.stackexchange.com/questions/227918/java-use-polymorphism-or-bounded -type-parameters – kyle

+0

@ftor检查我更新的答案,因为它更好地解释了我以前的评论和OOP,但在流程的上下文中。 – kyle

相关问题