我不明白Unions是如何运作的。
关于exact Union Types
以下代码会在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)
}
答案 0 :(得分:1)
您已将HolidayType
定义为MountainType
或HolidayType
类型的联合。 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'
}