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 - 来自 JQuery 数组的 Google 图表

javascript - 窗口大小后背景图像调整大小

javascript - 在 reactjs 中使用 HTMLAudioElement 创建简单的播放器

javascript - 如何在流中定义和导入类类型?

javascript - 单击后更新 HTML 内容

javascript - [WDS] 不断断开!错误,ReactJs,Webpack

javascript - React 之前隐藏时不会渲染 Prop 的子数组

node.js - 如何使用 Flow 抽象空/未定义检查?

javascript - 键入一个函数,该函数采用与对象类型匹配的键和值,然后使用它们

javascript - 在谷歌图表中设置 float