Flow 的 $ElementType 的奇怪行为
A strange behaviour of Flow's $ElementType
我在 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 只会查看函数签名,而不会查看函数体。不管函数体总是 returns a boolean
,用法与签名相匹配,所以它应该进行类型检查。
在函数内部,Flow 做相反的事情。它只会根据签名对正文进行类型检查,而不会考虑函数的实际调用方式。在这种情况下,对于任何可能的键,它不可能知道 O
的元素是什么类型。
它能做的最好的事情是确保任何返回值的类型实际上是从您使用提供的键从中提取的值派生的,并且完全假定该类型是错误的。显然它没有这样做,这可能是 $ElementType
的限制。
围绕 $ElementType
有很多未解决的问题,所以它看起来有点不稳定,但仍然值得 logging a bug report 如果情况不同。
我在 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 只会查看函数签名,而不会查看函数体。不管函数体总是 returns a boolean
,用法与签名相匹配,所以它应该进行类型检查。
在函数内部,Flow 做相反的事情。它只会根据签名对正文进行类型检查,而不会考虑函数的实际调用方式。在这种情况下,对于任何可能的键,它不可能知道 O
的元素是什么类型。
它能做的最好的事情是确保任何返回值的类型实际上是从您使用提供的键从中提取的值派生的,并且完全假定该类型是错误的。显然它没有这样做,这可能是 $ElementType
的限制。
围绕 $ElementType
有很多未解决的问题,所以它看起来有点不稳定,但仍然值得 logging a bug report 如果情况不同。