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)