function f(a ?: Array<string>) {
a = a || [];
a.map // Here it is ok
return Promise.resolve()
.then(() => a.map) // THROWS, WHY?
}
最佳答案
Flow的类型细化是保守的。这意味着当无法确定它们将保持时会主动invalidates them。
在这种情况下,Flow看到a
已被重新分配,因此不能为null
/ undefined
。但是,它没有做分析就知道总是会是null
/ undefined
-就目前所知,以后的一些分配可能会将其重新分配给null
/ undefined
。
它还不知道何时传递给.then
的回调将被调用。因此,保守地使细化无效。
请注意,此问题并非特定于Promise
。只要在非常量变量上应用了细化,就会发生这种情况,以后在闭包中使用它。在封盖内部,精制将被放弃。
简单的解决方法是使用const
。然后,Flow知道所应用的任何类型优化都将始终有效,因为永远无法重新分配变量:
function f(a_ ?: Array<string>) {
const a = a_ || [];
a.map // Here it is ok
return Promise.resolve()
.then(() => a.map) // THROWS, WHY?
}