我在 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/