Flow类型检查未遵循类属性手动校验规则的技术咨询
搞定Flow忽略非空校验的问题
嘿,我之前也碰到过Flow这个烦人的问题!你遇到的其实是Flow类型窄化失效的情况——明明已经校验过this.foo不是null/undefined,但只要在校验和赋值之间插了点代码(哪怕是空操作),Flow就“失忆”了,不再认之前的校验结果。
为啥会这样?
Flow的类型窄化是基于代码路径分析的,但它会假设校验之后的代码有可能改变变量的值,哪怕你只是加了个空行或者无意义的语句,它都会重新把this.foo的类型拓宽回包含null/undefined的版本,自然就报错了。
几个实用的解决办法:
先存临时变量再用:在校验通过后,立刻把
this.foo赋值给一个临时变量,之后就用这个变量干活,Flow会牢牢记住它的窄化类型:if (this.foo != null) { const myFoo: string = this.foo; // 这里完全没问题 // 哪怕后面加再多代码,用myFoo都不会报错 // 比如: console.log("随便做点啥"); console.log(myFoo.length); }用类型断言(谨慎用):如果你百分百确定
this.foo此时不可能是null/undefined,可以直接用类型断言强制告诉Flow它的类型,但这种方法相当于跳过Flow的校验,一定要确保逻辑没问题:const myFoo: string = (this.foo: string);把校验和使用放一块:尽量让非空校验和变量赋值、使用在同一个代码块里,中间别插无关代码,这样Flow能准确跟踪类型变化。
我当时用第一个方法就解决了问题,你可以试试!
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

