如何在Flow中轻松选择类型的属性?

时间:2018-01-07 14:47:23

标签: javascript flowtype

我对Flow相对较新,并试图围绕如何在我的应用程序中键入模型。

假设我有一个名为Car的模型,其模型如下:

type Car = {
  id: string,
  make: string,
  model: string,
  owner?: ?{ name: string }
};

现在假设我的应用程序将创建一个汽车对象,但由于尚未保存,因此它没有其他必需的id属性:

const newCar = {
  make: 'Honda',
  model 'Accord',
};

有没有办法轻松选择Car的多个属性来分配给newCar

类似的东西:

const newCar: $Pick<Car, ['make', 'model']>;

或者在Flow中有更惯用的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

type Car = {
  id: string,
  make: string,
  model: string,
  owner?: ?{ name: string }
};

const newCar: $Diff<Car, { id: string }> = {
  make: 'Honda',
  model: 'Accord'
}

FLOW TRY

另一种方法非常相似(但我认为第一种方法使意图更清晰):

const newCar: { ...Car, id?: string } = {
  make: 'Honda',
  model: 'Accord'
}

如果你需要的只是移除id,这非常有效。当您开始删除更多字段时,这可能会变得很麻烦。

答案 1 :(得分:0)

使用交集类型,您可以为已保存的实例指定基本类型和更具体的版本。

type UnsavedCar = {
  make: string,
  model: string,
  owner?: ?{ name: string }
}

type Car = UnsavedCar & {
  id: string;
}

在以下功能中也很有效:

function saveCar(car: UnsavedCar): Car { /* ... */ }