Javascript 空值保护不';内部forEach循环不工作

Javascript 空值保护不';内部forEach循环不工作,javascript,functional-programming,flowtype,Javascript,Functional Programming,Flowtype,在下面的代码中,第二个保护程序不能在forEach循环内断言ab.cv的非空性,在该循环中,取消注释本地相同的保护程序可以使其工作。为什么会这样 type B = {| bv: B[], cv: ?number |} let ab: B = {bv: [], cv: 1} if (ab.cv) { // First guard const a = ab.cv + 1 // Works } var a2; if (ab.cv) {

在下面的代码中,第二个保护程序不能在
forEach
循环内断言
ab.cv
的非空性,在该循环中,取消注释本地相同的保护程序可以使其工作。为什么会这样

type B = {|
    bv: B[], 
    cv: ?number
|}

let ab: B = {bv: [], cv: 1}
if (ab.cv) {          // First guard
  const a = ab.cv + 1 // Works
}
var a2;
if (ab.cv) {                                           // Second guard
  ab.bv.forEach(b => {/*if (ab.cv) */a2 = ab.cv + 1})  // Doesn't work except if uncommented
                                                       // Cannot perform arithmetic operation because null or undefined [1] is not a number.
}

流使在
forEach
回调之前完成的优化无效。回调被认为是一个函数调用,任何函数调用都会使优化无效。更多关于此的信息,请访问和

解决此问题的一种方法是将选中值存储在局部变量中:

const cv = ab.cv;
var a2;

if (cv) {
  ab.bv.forEach(b => {a2 = cv + 1})
}