Flowtype 流量不';无法识别回调内部的细化
此代码通过流检查:Flowtype 流量不';无法识别回调内部的细化,flowtype,Flowtype,此代码通过流检查: /* @flow */ function test (list: ?Array<string>): Promise<number> { if(list !== null && list !== undefined) { return Promise.resolve(list.length) } else { return Promise.resolve(0) } } console.log(test(nu
/* @flow */
function test (list: ?Array<string>): Promise<number> {
if(list !== null && list !== undefined) {
return Promise.resolve(list.length)
} else {
return Promise.resolve(0)
}
}
console.log(test(null))
很明显,列表不能为空,所以代码结构中一定有某种东西使flow无法识别它
我想了解我遇到了什么限制,以及如何克服它。谢谢 基本上,当执行
()=>list.length
时,Flow不知道您的类型优化(空检查)是否会保持。在该回调流中,只查看列表的类型,也就是说它可以为null
第一个代码段和第二个代码段的区别在于,在第二个代码段列表中
跨越了一个函数边界–您在不同的函数中使用它,而不是在优化其类型的函数中使用它
一种解决方案是将list.length提取到变量中,并在回调中使用该变量
var length = list.length;
return Promise.resolve().then(() => length)
这也可能起作用:
var list2: Array<string> = list;
return Promise.resolve().then(() => list2.length)
var-list2:Array=list;
返回Promise.resolve().then(()=>list2.length)
请注意,即使是立即调用的回调也存在此问题,例如,在使用
map
或forEach
时。flow的github上有一个关于此的问题,但我在快速搜索后找不到它。谢谢Nikita!此处的“注意事项”部分对此进行了详细描述
var length = list.length;
return Promise.resolve().then(() => length)
var list2: Array<string> = list;
return Promise.resolve().then(() => list2.length)