使用Flow键入具有默认属性的对象

时间:2018-01-20 22:43:49

标签: flowtype

我对如何使用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中使用默认对象属性的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

这看起来像一个bug。它似乎是与null的治疗相关的错误。我注意到,如果您将ppp的类型联合限制为number | void(其中voidundefined的类型),那么您的代码可以正常工作:< / p>

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值。