Javascript 是流量';与这种多态性固有的结构亚型相关的信息丢失?
流程中的结构子类型可能导致信息丢失:Javascript 是流量';与这种多态性固有的结构亚型相关的信息丢失?,javascript,polymorphism,flowtype,subtyping,structural-typing,Javascript,Polymorphism,Flowtype,Subtyping,Structural Typing,流程中的结构子类型可能导致信息丢失: 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) (这段代码很糟糕
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只是一个花哨的词,用于确定两种类型是否相等,也就是说,它使刚性类型系统更加灵活
- 参数多态性(流中的泛型)指出两种类型总是等价的,因为类型根本不重要
- 子类型多态性(流中的子类型)表示,如果可以从两种类型派生层次结构,则这两种类型是等效的,即将子类型包含在其子类型下
- 行多态性类似于子类型,但解决了信息丢失问题(但从技术上讲,不再存在子类型关系,因此它不是子类型的一种形式)
- 有界多态性表示两种类型仅在特定目的下是等效的,例如相等、顺序、映射等
function f<T: O>(o: T): T {
o.x *= 2;
o.y *= 2;
return o;
}
r.z; // okay
函数指定它显式查找O类型的对象,而不是O类型的对象或允许O的子类型。在OPs函数中,我们将参数o向下转换为类型o,而不是使用泛型(这很糟糕)。处理此问题的正确方法是利用泛型指定它可以是O类型或O的子类型,具体操作如下:
function f<T: O> (o: T): T {
o.x *= 2;
o.y *= 2;
return o;
}
函数f(o:T):T{
o、 x*=2;
o、 y*=2;
返回o;
}
以及它与函数参数、对象等的关系
有关部分是:
- 泛型允许您在添加约束时保留更具体的类型。这样,泛型上的类型充当“边界”
- 泛型有时允许您将类似参数的类型传递给函数。这些被称为参数化泛型(或参数多态性)。”
function f<T: O> (o: T): T {
o.x *= 2;
o.y *= 2;
return o;
}