流 - 与联合类型错误的交集:“无法在交集类型的任何成员上访问属性”

时间:2017-06-19 16:11:30

标签: javascript flowtype

可以尝试使用代码here

我的类型是联合类型的交集:

type Location = {
  latitude: number,
  longitude: number
} & ({
  locationType: 'country',
  country: string
} | {
  locationType: 'state',
  state:string
})

我有另一个基于其中一种联合类型的函数:

const getLocationValue = (location: Location): string => {
  if (location.locationType === 'country')
    return location.country
  else
    return location.state
}

然而,这给了我错误:

  

属性country。无法在交叉点类型的任何成员上访问属性

^ property state。无法在交叉点类型的任何成员上访问属性

Flow应该能够理解,如果locationType是country,那么它应该有country属性。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

为了使用disjoint union Flow,需要2种类型才能选择。目前,您只定义了一种类型:Location。您可以将常用值拆分为一种" abstract"键入并使Location成为真正的类型联合,以使Flow能够在它们之间进行选择。它可能如下所示:

type AbstractLocation = {
  latitude: number,
  longitude: number,
}

type CountryLocation = AbstractLocation & {
  country: string,
  locationType: 'country',
}

type StateLocation = AbstractLocation & {
  locationType: 'state',
  state: string,
}

type Location = CountryLocation | StateLocation

在flow.org上试试:working example