FlowType:null检查失败

wiz*_*loy 6 javascript flowtype

为什么空检查失败的func1,而它在确定func2

/* @flow */

const func1 = (arr?: Array<*>) => {
  const isArrayNotEmpty = arr && arr.length;

  if (isArrayNotEmpty) {
    arr.forEach((element) => console.log(element));
  }
}

const func2 = (arr?: Array<*>) => {
  if (arr && arr.length) {
    arr.forEach((element) => console.log(element));
  }
}
Run Code Online (Sandbox Code Playgroud)

实例

Nat*_*ote 4

我不知道 Flow 不支持这一点的原因,但它不支持。目前,它要求对类型细化的检查实际上发生在if语句中实际发生的类型细化,并且如果它们被抽象为单独的变量,则不会跟踪它们。

有一个您可能可以接受的替代方案(我不确定它是否在任何地方都有记录):

/* @flow */

const func1 = (arr?: Array<*>) => {
  if (isArrayNotEmpty(arr)) {
    arr.forEach((element) => console.log(element));
  }
}

function isArrayNotEmpty(x: mixed): %checks {
  return x && x.length;
}
Run Code Online (Sandbox Code Playgroud)

尝试流程

特殊的%checks返回类型向 Flow 指示它应该查看函数体,以找出它所传递的变量类型的含义。我相信这样的函数体内可以包含的内容有一些限制。甚至可能是它只需要返回单个表达式的情况。不过,这应该足以让您进行实验。