【问题标题】:Typing objects with default properties using Flow使用 Flow 键入具有默认属性的对象
【发布时间】:2018-01-31 02:48:04
【问题描述】:

我对如何使用 Flow 键入具有默认属性的对象有点困惑。

例如,我有一个函数接受具有默认属性的对象,如下所示:

function load({ p = 1, pp = 5 }: Payload) {
  return {
    p,
    pp
  };
}

如果我这样定义 Payload 的类型:

type Payload = {
  p: ?number,
  pp: ?number
}

Flow 会抱怨(显然,因为对象的字段不再可以为空)。请参阅Try Flow 上的示例

如果我重新定义 Payload 使其字段不再可以为空,Flow 会很高兴;但这当然会导致无法实际使用默认属性,如下例所示:

type Payload = {
  p: number,
  pp: number
}

function load({ p = 1, pp = 5 }: Payload) {
  return {
    p,
    pp
  };
}

function test() {
  let p = null;
  let pp = 5
  load({p, pp}) 
}

Try Flow 上的示例

在 Flow 中使用默认对象属性的正确方法是什么?

【问题讨论】:

  • 不幸的是,这似乎是 Flow 的一个错误。这里有一个关于它的open issue

标签: flowtype


【解决方案1】:

这看起来确实像一个错误。这似乎是与null 的处理有关的错误。我注意到,如果您将ppp 的类型联合限制为number | void(其中voidundefined 的类型),那么您的代码就可以工作:

type Payload = {
  p: number | void,
  pp: number | void
}

function load({ p = 1, pp = 5 }: Payload) {
  return {
    p,
    pp
  };
}

function test() {
  let p /* undefined */
  let pp = 5
  load({p, pp}) 
}

但如果您使用联合 number | nullnumber | null | void(这是 ?number 的扩展形式),则会出现相同的错误。

我的猜测是这与默认值在 Javascript 中的工作方式有关。如果属性的值为undefined,则使用默认值。但如果属性值为null,则不使用默认值。因此,您可能无论如何都不想允许null 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2021-09-23
    • 2020-10-20
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多