我最近将Flow应用于我的React Native项目。到目前为止,大多数事情都令人满意。
let player ?Object = new Player();
if (this.player) {
this.player.stop();
this.player.destroy();
this.player = null;
}
然而,Flow希望我像下面这样做。
let player ?Object = new Player();
if (this.player) {
this.player.stop();
}
if (this.player) {
this.player.destroy();
}
this.player = null;
有没有适当的方法来处理这种情况?我不想在这里使用抑制评论,因为这不是一个例外情况。
答案 0 :(得分:2)
Flow对类型细化(例如空值检查)持悲观态度。
在您的示例中,Flow不知道对this.player.stop()
的调用是否将this.player
设置为null
或undefined
。因此,它必须假设它可能,并使细化无效。
通常我会通过将属性拉出到局部变量并对其进行操作来解决此问题:
let player ?Object = new Player();
const constPlayer = this.player;
if (constPlayer) {
constPlayer.stop();
constPlayer.destroy();
this.player = null;
}
这有点冗长,但并不像每次进行单独的空检查一样糟糕。
查看dynamic type tests caveats部分了解详情。