流联合类型和可选属性

时间:2017-09-26 08:29:58

标签: javascript flowtype

我刚遇到一个令我感到困惑的问题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

但是,values显然是可选的。更奇怪的是,以下作品:

const label: MenuLabel = { ...msg };

1 个答案:

答案 0 :(得分:0)

看起来要使“交叉点类型+选项”工作,您必须在两种类型中定义可选值。

// @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;