需要澄清关于flowtype“精确联盟类型”

时间:2018-03-11 20:17:33

标签: flowtype

我不明白Unions是如何运作的。

文档参考

关于exact Union Types

,请参阅此doc example

问题

以下代码会在item.rocks

上引发流量错误
/* @flow */

type MoutainType = {|
  rocks: boolean,
|};

type OceanType = {|
  waves: boolean,
|};

type HolidayType = MoutainType | OceanType;


const haveHoliday = (item: HolidayType) => {
  return item.rocks; //----------------> Error (but shouldn't)
}

试一试

See live demo

1 个答案:

答案 0 :(得分:1)

您已将HolidayType定义为MountainTypeHolidayType类型的联合。 Flow需要能够确定它正在处理哪种类型,然后才能访问独占成员属性而不会抛出错误。

如果您在尝试访问它之前测试rocks属性,那么Flow将能够确定正在使用哪种类型。

const haveHoliday = (item: HolidayType) => {
  if (typeof item.rocks !== 'undefined') {
      // Flow now knows that this must be a MountainType
      return item.rocks;
  }
}

查看Disjoint Unions的文档,看看是否有一个文字值可以用作类型的选择器,这样可以为您提供更自然的代码路径,例如。

type MountainType = {
  terrain: 'rocks'
}

type OceanType = {
  terrain: 'waves'
}

type HolidayType = MountainType | OceanType

const haveHoliday = (item: HolidayType): boolean => {
  return item.terrain === 'rocks'
}