我在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
。
谢谢!
答案 0 :(得分:2)
使用函数的类型检查代码时,Flow仅查看函数签名,而不查看正文。不管函数的主体始终返回boolean
的事实,用法都与签名匹配,因此此类型检查应按其应进行。
在函数内部,Flow执行相反的操作。它只会根据签名对主体进行类型检查,而不会考虑函数的实际调用方式。在这种情况下,对于任何可能的键,它不可能知道O
的元素是什么类型。
最好的办法是确保返回的值的类型实际上是从使用提供的键从中拉出的值派生的,并且完全假定该类型是错误的。显然,它没有这样做,这可能是对$ElementType
的限制。
$ElementType
周围存在很多未解决的问题,因此看起来有些不稳定,但是如果情况有所不同,logging a bug report还是值得的。