Flow的$ ElementType的奇怪行为

时间:2018-09-19 11:43:13

标签: 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。 谢谢!

1 个答案:

答案 0 :(得分:2)

使用函数的类型检查代码时,Flow仅查看函数签名,而不查看正文。不管函数的主体始终返回boolean的事实,用法都与签名匹配,因此此类型检查应按其应进行。

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

最好的办法是确保返回的值的类型实际上是从使用提供的键从中拉出的值派生的,并且完全假定该类型是错误的。显然,它没有这样做,这可能是对$ElementType的限制。

$ElementType周围存在很多未解决的问题,因此看起来有些不稳定,但是如果情况有所不同,logging a bug report还是值得的。