【问题标题】:Flow union types and optional properties流联合类型和可选属性
【发布时间】:2017-09-26 17:26:07
【问题描述】:

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

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    看起来要让“Intersection Types + Optionals”工作,你必须在这两种类型中定义可选值。

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

    鉴于 cmets,也许您正在寻找联合类型而不是交集类型?

    // @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 类型。
    • 我明白了,你想要的不是 Union 类型而不是交集类型吗?
    • 没有。我需要以下有效 MenuLabel 值:{ id: 'test', values: { foo: 'bar' } }
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 2020-01-25
    • 2017-05-31
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多