Please refer to this example.

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?
}

10-01 01:38
查看更多