Javascript 一种奇怪的流动行为';s$ElementType

Javascript 一种奇怪的流动行为';s$ElementType,javascript,reactjs,flowtype,Javascript,Reactjs,Flowtype,我在中找到了下一个代码($ElementType的最后一个示例): 函数getProp(o:o,p:p):$ElementType{ 返回o[p]; } (getProp({a:42},'a'):number);//好啊 我把它改成: function getProp<O: {+[string]: mixed}, P: $Keys<O>>(o: O, p: P): $ElementType<O, P> { return true; // no error

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

函数getProp(o:o,p:p):$ElementType{ 返回o[p]; } (getProp({a:42},'a'):number);//好啊 我把它改成:

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?
函数getProp(o:o,p:p):$ElementType{ 返回true;//是否没有错误? } (getProp({a:42},'a'):number);//好啊 但是没有错误

据我所知,返回值的
类型
是从
$ElementType
推断出来的,并不等同于
混合
类型,但也不应该是
布尔

请告知我,在这种情况下,返回值true的类型为何为
number

谢谢

当使用函数的类型检查代码时,流将只查看函数签名,而不查看正文。不管函数体始终返回
布尔值这一事实如何,用法都与签名匹配,因此此类型会按其应该的方式进行检查

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

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


周围的
$ElementType
中有很多未解决的问题,因此它看起来有点不稳定,但如果情况不同,它可能还是值得的。

在检查使用函数的代码类型时,流将只查看函数签名,而不查看函数体。不管函数体始终返回
布尔值这一事实如何,用法都与签名匹配,因此此类型会按其应该的方式进行检查

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

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

周围的
$ElementType
中有很多未解决的问题,因此它看起来有点不稳定,但如果情况不同,它可能还是值得的

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?