我对如何使用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中使用默认对象属性的正确方法是什么?
答案 0 :(得分:0)
这看起来像一个bug。它似乎是与null
的治疗相关的错误。我注意到,如果您将p
和pp
的类型联合限制为number | void
(其中void
是undefined
的类型),那么您的代码可以正常工作:< / 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 | null
或number | null | void
(?number
的扩展形式),则会出现相同的错误。
我的猜测是,这与默认值在Javascript中的工作方式有关。如果属性的值为undefined
,则使用默认值。但是,如果属性值为null
,则不会使用默认值。因此,您可能不希望允许null
值。