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

时间:2018-03-07 18:59:39

标签: 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 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);
}

由于value类型中的Params键接受numbernullundefined类型,因此请将此键的默认值设置为其中之一有效,但会引发以下错误。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

这是一个流程中的错误。 https://github.com/facebook/flow/issues/183#issuecomment-358607052。最简单的修复可能只是不依赖于默认的解构值。像

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

答案 1 :(得分:2)

如@TLadd所述,它似乎确实是bug

问题特别在于使用默认值进行对象解构时使用null作为允许类型。

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

以下是一些可能适合您的用例(Try)的替代方案:

// @flow
type MaybeParams = {
  value: ?number,
}
function acceptsMaybeNumber({
  // originalValue = 1  // FAIL
  // $FlowFixMe
  value = 1,            // PASS (but not in Try where $FlowFixMe is disabled)
}: MaybeParams) {
  console.log(value);
}

type OptionalParams = {
  value?: number,
}
function acceptsOptionalNumber({
  value = 1,                // PASS
}: OptionalParams) {
  console.log(value);
}

acceptsOptionalNumber({ })  // PASS


type UndefinedParams = {
  value: void | number,
}
function acceptsUndefinedNumber({
  value = 1,                // PASS
}: UndefinedParams) {
  console.log(value);
}

acceptsUndefinedNumber({ value: undefined })    // PASS

如果您特别希望将null作为允许的指定值处理,那么您将不得不在解构中避免使用默认值。