Flowtype Flow看不到我的数组不是空的吗?

Flowtype Flow看不到我的数组不是空的吗?,flowtype,Flowtype,考虑到以下准则: 常数大小=500 const index=new Arraysize.fill0.map,idx=>idx 让瓦尔斯 如果瓦尔斯{ VAL=新阵列大小。填充0 } index.forEachv=>vals[v]++ 注意:我知道这段代码可能看起来很奇怪。对于一个数组索引并将值用作另一个VAL的索引,可能不太常见。但它是有效的,我只是试着做一个真实用例的简单例子 流返回此错误: indexes.forEach(v => vals[v]++)

考虑到以下准则:

常数大小=500 const index=new Arraysize.fill0.map,idx=>idx 让瓦尔斯 如果瓦尔斯{ VAL=新阵列大小。填充0 } index.forEachv=>vals[v]++ 注意:我知道这段代码可能看起来很奇怪。对于一个数组索引并将值用作另一个VAL的索引,可能不太常见。但它是有效的,我只是试着做一个真实用例的简单例子

流返回此错误:

indexes.forEach(v => vals[v]++)
                    ^ access of computed property/element. Computed property/element cannot be accessed on possibly undefined value
indexes.forEach(v => vals[v]++)
                    ^ uninitialized variable
你可以试穿一下

要删除错误,我必须更改最后一行以验证每次迭代的VAL:

index.forEachv=>vals&&vals[v]&&vals[v]++ 如果我用立即初始化的内容替换VAL声明,错误也会消失

让VAL=new Arraysize.fill0 因此,使用一个数组值作为另一个数组的索引似乎不是问题

flow难道不能理解VAL的定义吗


感谢您的建议。

Flow可能无法推断该级别的值,因此您可以这样做

const size = 500
let vals 
if (!vals) {
  vals = new Array(size).fill(0)
}
let newVals = vals
vals.map(v => newVals[v]++)

这里的问题不是因为flow认为数组是空的。这是因为流假设条件初始化实际上是有条件的,而您知道if分支将始终被执行

Flow关注的是类型,而不是值。即使某些值在编译时是已知的

就流量而言,

if (<boolean expression here>) {
  vals = new Array(size).fill(0)
}
或者更好:

const size = 500
const indexes = new Array(size).fill(0).map((_,idx) => idx)
const vals = new Array(size).fill(0)
indexes.forEach(v => vals[v]++)

谢谢但你的回答让我觉得flow更奇怪:。这个案子看起来很愚蠢。newVals是正确的为什么vals不是?难以置信。问题可能是因为您正在将VAL的数据类型从未定义更改为数组。理想情况下,VAL应该是从初始化点开始的数组类型。我同意@HarshVardhan,这是唯一的方法。。。Flow并不聪明,因此我们需要以他理解的方式涵盖每一段代码:
const size = 500
const indexes = new Array(size).fill(0).map((_,idx) => idx)
const vals = new Array(size).fill(0)
indexes.forEach(v => vals[v]++)