Javascript 流类型:需要一个属性或另一个属性

Javascript 流类型:需要一个属性或另一个属性,javascript,reactjs,flowtype,Javascript,Reactjs,Flowtype,我试图在流中定义一个类型,以便您必须指定客户机或发票。这是我的尝试: type Client = { client: { id: number, }, invoice?: { id: number, }, }; type Invoice = { client?: { id: number, }, invoice: { id: number, }, }; type Props = Client | Invoice; 如果客户未

我试图在流中定义一个类型,以便您必须指定客户机或发票。这是我的尝试:

type Client = {
  client: {
    id: number,
  },
  invoice?: {
    id: number,
  },
};

type Invoice = { 
  client?: {
    id: number,
  },
  invoice: {
    id: number,
  },
};

type Props = Client | Invoice;
如果客户未定义,则必须定义发票,反之亦然

但是,当我尝试基于此访问属性时,flow typechecker会抛出错误:

function getAssignedId({client, invoice}: Props) {
  return client ? client.id : invoice.id;
}
结果:

22:   return client ? client.id : invoice.id;
                                          ^ Cannot get `invoice.id` because property `id` is missing in undefined [1].
References:
21: function getAssignedId({client, invoice}: Asssignement) {
                                    ^ [1]


知道为什么会这样吗?有没有其他方法可以通过flow实现这一点

您没有检查是否定义了发票。如果添加检查,则在通过以下方式解构类型时不会抛出错误:

{client, invoice}: Props
这些变量的类型已解析<代码>客户端和
发票
都解析为
?{id:number}
,因为它们当时可能存在,也可能不存在。typechecker不记得这两个对象是链接的,因为您已将它们分隔开

如果不将它们分开,flow可以跟踪联合类型并做正确的事情

function getAssignedId(obj: Props) {
  return obj.client ? obj.client.id : obj.invoice.id;
}