Flow

时间:2016-10-13 23:15:00

标签: flowtype

我想在仅更改单个属性时复制对象。如果没有Flow,我可以使用对象扩展运算符这样做:

class Point { x: number = 10; y: number = 10; }
const p1 = new Point();
const p2 = {...p1, y: 5};

但是当我向p1和p2添加类型注释时:

const p1 = new Point();
const p2 = {...p1, y: 5};

我收到以下错误:

 11: const p2:Point = {...p1, y: 5};
                      ^^^^^^^^^^^^^ object literal. This type is incompatible with
 11: const p2:Point = {...p1, y: 5};
          ^^^^^ Point

如何在Flow中以类型安全的方式实现此类操作?

例如,在Elm中,我可以这样做:

p2 = { p1 | y = 5 }

Flow中必须有一些等价物。

3 个答案:

答案 0 :(得分:5)

说明:class不起作用,因为它使用nominal typingtype有效,因为它使用结构类型。

答案 1 :(得分:4)

使用对象传播时,您无法获得对象的精确副本。相反,您将获得一个普通对象,其中复制了所有源对象的属性。因此,Flow就在这里,p2不是Point。试试这个:

type Point = { x: number, y: number };
const p1: Point = { x: 10, y: 10 };
const p2: Point = { ...p1, y: 5 };

答案 2 :(得分:2)

如果您(确实)需要class而不是type别名,则可以通过定义仅包含一个参数的构造函数来模拟Elm语法p2 = { p1 | y = 5 }

export class Point {
  x: number = 10;
  y: number = 10;
  constructor(fields?: { x: number, y: number }) {
    Object.assign(this, fields)
  }
}
const p1 = new Point()
const p2: Point = new Point({...p1, y: 5})