将空对象传递给类型

时间:2018-03-11 04:44:49

标签: reactjs flowtype

我有这个定义:

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 => ({});

这是一个错误,还是我在这里遗漏了什么?

1 个答案:

答案 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 {}