为什么不允许对 Typescript 中的数组条目进行空检查?

Why is null check not allowed on array entry in Typescript?

我有一个可以为 null 或游戏手柄的对象数组:

let pads : (Gamepad | null)[] = navigator.getGamepads()

如果第一个条目是游戏手柄(而不是 null),我想执行一些代码

let pad: Gamepad | null = gamepads[0]
if (pad) {
     myOtherCode(pad)
}

这个 null 检查有效,但我必须创建一个额外的临时变量。有没有办法直接对数组的第一个条目进行空检查?

if (gamepads[0]) {
     myOtherCode(gamepads[0])
}

Argument of type 'Gamepad | null' is not assignable to parameter of type 'Gamepad'. Type 'null' is not assignable to type 'Gamepad'

我的其他代码只是一个需要游戏手柄的函数:

function myOtherCode(g:Gamepad) {
    console.log(g)
}

这是一个 compiler bug,其中具有索引签名的类型(如数组)在索引 属性 访问(使用方括号)时未受到正确的类型保护。目前尚不清楚何时会修复此问题(截至 2019 年 5 月 11 日,该问题表示 "Milestone: TypeScript 3.5",但该版本将很快推出,所以我有点怀疑能否实现里程碑)。正如您所注意到的,解决方法是分配给一个新变量并检查它。希望有所帮助;祝你好运!