我有这个定义:
export type Entry = {|
id: string,
title: string,
|};
...
export type Props = {
entries: Array<Entry>,
...
// The following is not crashing
const rowGetter = ({ index }): Entry => props.entries[index] || {};
使用flow-bin@0.67.1
,上面的代码没有崩溃。我预计它会崩溃,因为定义声明返回值是Entry
类型,而不是空对象。
当然,如果我按如下方式更改箭头函数的定义,它会按预期崩溃,说不精确的文字不匹配,并且缺少属性Id和title:
const rowGetter = ({ index }): Entry => ({});
这是一个错误,还是我在这里遗漏了什么?
答案 0 :(得分:0)
这是Flow关于potentially undefined array elements的设计。
如果索引超出范围(或稀疏数组),则props.entries
的任何索引都被视为解析为Entry
,而不是undefined
。
因此,|| {}
不被视为可行分支,因此不予评估。在您的重构中,您已删除了数组访问权限,{}
被正确报告为Entry
无效。
如果您将我们的方法更改为:
const rowGetter = ({ index }): Entry => {
if (typeof props.entries[index] !== 'undefined') {
return props.entries[index]
}
return {}
}
然后流程会正确报告return {}
。