Javascript 流-可能类型与看似有效的默认对象参数不兼容

Javascript 流-可能类型与看似有效的默认对象参数不兼容,javascript,flowtype,Javascript,Flowtype,以代码为例: // @flow type Params = { value: ?number, } function acceptsMaybeNumber({ // Error:(6, 3) null or undefined [1] is incompatible with number [2]. // value = 4 // <--- DOESN'T WORK // Error:(7, 3) null or undefined [1] is incompatibl

以代码为例:

// @flow
type Params = {
  value: ?number,
}
function acceptsMaybeNumber({

  // Error:(6, 3) null or undefined [1] is incompatible with number [2].
  // value = 4 // <--- DOESN'T WORK

  // Error:(7, 3) null or undefined [1] is incompatible with number [2].
  // Error:(7, 11) null [1] is incompatible with number [2].
  // value = null // <--- DOESN'T WORK

  // Error:(15, 3) null or undefined [1] is incompatible with number [2].
  // Error:(16, 11) undefined [1] is incompatible with number [2].
  // value = undefined // <--- DOESN'T WORK

  value // <-- WORKS
}: Params) {
  console.log(value);
}
由于Params type中的value键接受number、null和未定义的类型,因此将此键的默认值设置为这两个类型中的任何一个都应该是有效的,但会引发以下错误

为什么会发生这种情况?

这是流程中的一个错误。最简单的修复方法可能就是不依赖默认的解构值。大概是

type Params = {
  value?: ?number,
}
function acceptsMaybeNumber(params: Params) {
  const value = typeof params.value === 'number' ? params.value : 4
  console.log(value);
}
这是流动中的一个错误。最简单的修复方法可能就是不依赖默认的解构值。大概是

type Params = {
  value?: ?number,
}
function acceptsMaybeNumber(params: Params) {
  const value = typeof params.value === 'number' ? params.value : 4
  console.log(value);
}

正如@TLadd所指出的,它看起来确实是一个错误

问题特别是在使用默认值进行对象分解时,将null用作允许的类型

$FlowFixMe可用于抑制错误,以避免损坏代码,或者您也可以使用$FlowDestructuringDefaultBug。注意:您需要将$Flow suppression注释放在紧靠默认赋值之前的一行上,因此您需要像在原始示例中那样在多行中打断参数

以下是一些可能适合您的用例的备选方案:


如果您特别希望将null作为允许的、指定的值来处理,那么您必须避免在解构中指定默认值。

正如@TLadd所指出的,它看起来确实是一个错误

问题特别是在使用默认值进行对象分解时,将null用作允许的类型

$FlowFixMe可用于抑制错误,以避免损坏代码,或者您也可以使用$FlowDestructuringDefaultBug。注意:您需要将$Flow suppression注释放在紧靠默认赋值之前的一行上,因此您需要像在原始示例中那样在多行中打断参数

以下是一些可能适合您的用例的备选方案:

如果您特别希望将null作为一个允许的、指定的值来处理,那么您必须避免在分解结构中指定默认值