javascript - Flow 的 $ElementType 的奇怪行为

标签 javascript reactjs flowtype

我在 flow.org 中找到了下一个代码($ElementType 的最后一个示例):

function getProp<O: {+[string]: mixed}, P: $Keys<O>>(o: O, p: P): $ElementType<O, P> {
      return o[p];
}
(getProp({a: 42}, 'a'): number); // OK

我将其更改为:

function getProp<O: {+[string]: mixed}, P: $Keys<O>>(o: O, p: P): $ElementType<O, P> {
  return true; // no error?
}
(getProp({a: 42}, 'a'): number); // OK?

但是没有错误。

据我了解,type返回值是从 $ElementType<O, P> 推断出来的且不等于mixed类型,但不应该是 boolean也是。

请告诉我为什么返回值 true 的类型为 number在这种情况下。 谢谢!

最佳答案

当对使用函数的代码进行类型检查时,Flow 将仅查看函数签名,而不查看函数体。尽管函数体始终返回 bool 值,但用法与签名相匹配,因此会按其应有的方式进行类型检查。

在函数内部,Flow 执行相反的操作。它只会根据签名对主体进行类型检查,而不会考虑函数的实际调用方式。在这种情况下,它不可能知道对于任何可能的键,O 的元素是什么类型。

它能做的最好的事情就是确保任何返回值的类型实际上是从您使用提供的键从中提取的值派生的,并使假定该类型完全出错。显然它没有这样做,这可能是 $ElementType 的限制。

$ElementType 周围有很多 Unresolved 问题,因此它看起来有点不稳定,但仍然可能值得 logging a bug report以防有所不同。

关于javascript - Flow 的 $ElementType 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52405090/

相关文章:

javascript - 使用 axios 和 nuxt 的服务器和客户端 API 调用的不同 baseURL

reactjs - 使用 nextJS 渲染图像时出错。图像不出现

javascript - 在 Redux 操作中将数据放入 "payload"键有什么好处?

javascript - 如何为具有字段的函数声明流类型?

javascript - 无法从另一个文件进行查询(connection.query 不是函数)

javascript - 如何使用javascript在包含json对象的变量上实现map方法

javascript - 如何将非数字字符串转换为 int

javascript - React 安装了 React Router 但无法让页面呈现

javascript - 如何在不使用 lambda 函数的情况下将参数发送到 React 渲染组件中的处理程序事件?

javascript - Flow 动态地将属性添加到 Error