此代码通过了流程检查:
/* @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 */
function test (list: ?Array<string>): Promise<number> {
if(list !== null && list !== undefined) {
return Promise.resolve().then(() => list.length)
} else {
return Promise.resolve(0)
}
}
console.log(test(null))
error:
property `length`. Property cannot be accessed on possibly null value
显然列表不能null
因此,代码结构中一定存在某些问题,导致 Flow 无法识别这一点。
我想了解我遇到的限制以及如何解决它。谢谢!
基本上,Flow 不知道您的类型细化(空检查)将在何时保持() => list.length
被执行。在该回调中,Flow 只查看列表的类型 - 这表示它可以为 null。
第一个和第二个片段之间的区别在于第二个片段中list
跨越了函数边界——您在与精炼其类型的函数不同的函数中使用它。
一种解决方案是将 list.length 提取到变量中,并在回调中使用该变量。
var length = list.length;
return Promise.resolve().then(() => length)
这也可能有效:
var list2: Array<string> = list;
return Promise.resolve().then(() => list2.length)
请注意,即使对于立即调用的回调也存在此问题,例如使用时map
or forEach
。 flow的github上有一个关于这个的问题,但我快速搜索后找不到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)