Javascript 流联合类型和可选属性

Javascript 流联合类型和可选属性,javascript,flowtype,Javascript,Flowtype,我刚刚遇到了一个问题,这个问题让我困惑于flow。有人能向我解释一下为什么下面的问题不起作用,以及我将如何着手解决它 // @flow type MessageDescriptor = { id: string, defaultMessage?: string, description?: string }; type MenuLabel = MessageDescriptor & { +values?: { +[name: string]: string } };

我刚刚遇到了一个问题,这个问题让我困惑于
flow
。有人能向我解释一下为什么下面的问题不起作用,以及我将如何着手解决它

// @flow

type MessageDescriptor = {
  id: string,
  defaultMessage?: string,
  description?: string
};

type MenuLabel = MessageDescriptor & {
  +values?: { +[name: string]: string }
};

const msg: MessageDescriptor = {
  id: 'test'
};

const label: MenuLabel = msg;
我得到的错误是:

9: type MenuLabel = MessageDescriptor & {                                        
                                        ^ property `values`. Property not found in

17: const label: MenuLabel = msg;
                             ^ object type
但是,
显然是可选的。更奇怪的是,下面的作品:

const label: MenuLabel = { ...msg };
看起来,要使“交叉点类型+选项”起作用,您必须在这两种类型中定义可选值

// @flow

type MessageDescriptor = {
  id: string,
  defaultMessage?: string,
  description?: string,
  +values?: { +[name: string]: string }
};


type MenuLabel = MessageDescriptor & {
  +values?: { +[name: string]: string }
};

const msg: MessageDescriptor = {
  id: 'test'
};

const label: MenuLabel = msg;
根据注释,您可能正在寻找联合类型而不是交叉类型

// @flow

type MessageDescriptor = {
  id: string,
  defaultMessage?: string,
  description?: string,
};


type MenuLabel = MessageDescriptor | {
  +values?: { +[name: string]: string }
};

const msg: MessageDescriptor = {
  id: 'test'
};

const label: MenuLabel = msg;
看起来,要使“交叉点类型+选项”起作用,您必须在这两种类型中定义可选值

// @flow

type MessageDescriptor = {
  id: string,
  defaultMessage?: string,
  description?: string,
  +values?: { +[name: string]: string }
};


type MenuLabel = MessageDescriptor & {
  +values?: { +[name: string]: string }
};

const msg: MessageDescriptor = {
  id: 'test'
};

const label: MenuLabel = msg;
根据注释,您可能正在寻找联合类型而不是交叉类型

// @flow

type MessageDescriptor = {
  id: string,
  defaultMessage?: string,
  description?: string,
};


type MenuLabel = MessageDescriptor | {
  +values?: { +[name: string]: string }
};

const msg: MessageDescriptor = {
  id: 'test'
};

const label: MenuLabel = msg;

不幸的是,这不是一个真正的解决方案,因为它们来自不同的库,所以我无法更改
MessageDescriptor
类型。我明白了,你不想要一个联合类型而不是交集类型吗?不。我需要以下内容才能有效
MenuLabel
value:
{id:'test',value:{foo:'bar'}
不幸的是,这不是一个真正的解决方案,因为它们来自不同的库,所以我无法更改
MessageDescriptor
类型。我明白了,您不想要联合类型而不是交叉类型吗?不。我需要以下内容才能有效
MenuLabel
值:
{id:'test',value:{foo:'bar'}