FlowType:null检查失败

时间:2017-03-10 13:17:46

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

Live example

1 个答案:

答案 0 :(得分: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;
}

tryflow

特殊的%checks返回类型向Flow指示它应该查看函数体,以弄清楚它传递的变量类型意味着什么。我相信对这种功能的身体有什么限制。甚至可能只需返回单个表达式。但是,这应该足以让你尝试它。