为什么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));
}
}
答案 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指示它应该查看函数体,以弄清楚它传递的变量类型意味着什么。我相信对这种功能的身体有什么限制。甚至可能只需返回单个表达式。但是,这应该足以让你尝试它。