使用Flow类型检查为行中的可空对象调用方法

时间:2017-02-11 08:52:11

标签: javascript flowtype

我最近将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;

有没有适当的方法来处理这种情况?我不想在这里使用抑制评论,因为这不是一个例外情况。

1 个答案:

答案 0 :(得分:2)

Flow对类型细化(例如空值检查)持悲观态度。

在您的示例中,Flow不知道对this.player.stop()的调用是否将this.player设置为nullundefined。因此,它必须假设它可能,并使细化无效。

通常我会通过将属性拉出到局部变量并对其进行操作来解决此问题:

let player ?Object = new Player();
const constPlayer = this.player;
if (constPlayer) {
    constPlayer.stop();
    constPlayer.destroy();
    this.player = null;
}

这有点冗长,但并不像每次进行单独的空检查一样糟糕。

查看dynamic type tests caveats部分了解详情。