FlowType:类型的继承(类型A是类型B的子集...)

时间:2017-02-16 18:05:34

标签: javascript flowtype

  

Flow 42发布以来,您可以   使用对象类型传播。 type TypeB = { ...TypeA };

我认为这是关于FlowType的初学者类型的问题,但我真的找不到满足我的答案。

我们假设我有这种类型

type A = {
 x: number
}

type B = {
 y: string
}

现在我想要另一种基于类型A和B的类型,如下所示:

type C = {
 ...A,
 ...B,
 z: boolean
}

恕我直言应该被解释为:

type C = {
  x: number,
  y: string,
  z: boolean
}

但这显然不起作用。

你能给我一些建议或最佳实践吗?非常感谢。

2 个答案:

答案 0 :(得分:12)

这是一个常见的功能请求,它实际上正在进行中。这里是a commit,它实现了类型传播的解析。我不确定这个功能的时间表是什么,但我相信它仍在继续工作。

现在,您可以在某些情况下使用交集类型(虽然它们并非真正针对此用例设计并且可能导致令人困惑的问题):

type C = A & B & {
  z: boolean
}

当然,您也可以选择复制属性。这绝对是最简单的事情,虽然我同意它有点难吃。

答案 1 :(得分:3)

我已经证实传播正如您所期望的那样,交叉口让我到处都是。这是一个简短的playground that shows flow type intersection failing to make a prop optional, whereas spread works

后代的示例代码:

// @flow

export type Affiliation = {
  id: string,
}

export type Address = {
  address1: string,
}


export type BaseContact = {
  id?: string,
  addresses: Array<Address>,
  affiliations?: Array<Affiliation>,
}

type C = BaseContact & {
  addresses: Array<Address>,
}

type CC = {
  ...BaseContact,
  addresses?: Array<Address>,
}

type CCI = BaseContact & {
  addresses?: Array<Address>,
}


class X {}

const c: C = new X() // fails
const cc: CC = new X() // fails
const cci: CCI = new X() // works