为什么Flow不会看到此多态联合类型中的对象成员?

时间:2017-05-17 13:26:10

标签: flowtype

设置

这是一个完整的try flow example来说明问题。

类型

export type ActionT<TT: string, PT> = {|
  +type: TT,
  +payload: PT,
  +error?: boolean,
  +meta?: any
|}

export type ChangePayloadT = {
  +_change: {|
    +state: 'PENDING' | 'FULFILLED' | 'REJECTED',
    +id: string,
    +error?: any,
    +message?: string,
  |}
}

export type IdPayloadT = {
  id: string,
}

type PayloadT = IdPayloadT | ChangePayloadT

type MyActionT = ActionT<'SET' | 'MERGE', PayloadT>

如您所见,MyActionT可以包含带有id_change对象的有效内容。它不是(?)a disjoint union,因为没有一个属性可以消除歧义。

这似乎应该有效,但不会:

function lookup3 (action: MyActionT): any {
  if (action.payload._change) {
    // why does this error?
    return action.payload._change.id  
  } else {
    return action.payload.id
  }
}

任何人都想关心我的原因吗?

1 个答案:

答案 0 :(得分:1)

好的,所以解决方案显然涉及使两种类型成为正确的不相交联合:

export type ChangePayloadT = {
  +_change: {|
    +state: $Keys<typeof asyncStates>,
    +id: string,
    +error?: any,
    +message?: string,
  |},
  id?: string,
}

export type IdPayloadT = {
  +_change?: void, 
  +id: string,
}

如果第二种类型现在具有明确的void _change,则流程知道根据_change的存在与否来区分类型。

Working tryflow耶。 :)