流类型:一个属性是必需的,或者另一个

问题描述 投票:0回答:2

我正在尝试定义流程中的类型,因此您必须指定或者客户或发票。这是我的尝试:

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

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

type Props = Client | Invoice;

如果未定义客户,则必须定义发票,反之亦然。

但是,当我尝试基于此访问属性时,流类型检查器会引发错误:

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]

You can try it here

知道为什么会这样吗?还有其他方法可以通过流程实现这一目标吗?

javascript reactjs flowtype
2个回答
0
投票

您不检查是否定义了发票。如果添加支票,则不会抛出错误


0
投票

当您通过以下方式解构类型时:

{client, invoice}: Props

这些变量的类型已解析。 clientinvoice都被解析为?{ id: number },因为它们当时可能存在或可能不存在。类型检查器不记得这两个对象是链接的,因为您已将它们分开。

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

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

Try flow link

© www.soinside.com 2019 - 2024. All rights reserved.