【问题标题】:Flow not crashing when passing empty object to a type将空对象传递给类型时流不会崩溃
【发布时间】:2018-03-11 20:31:04
【问题描述】:

我得到了这个定义:

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

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

【问题讨论】:

    标签: reactjs flowtype


    【解决方案1】:

    这是 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 {}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多