自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
}
但这显然不起作用。
你能给我一些建议或最佳实践吗?非常感谢。
答案 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