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

标签 typescript types nullable

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

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

如果第一个条目是游戏 handle (而不是 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'

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

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

最佳答案

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

关于typescript - 为什么不允许对 Typescript 中的数组条目进行空检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56093068/

相关文章:

asp.net-mvc - 带有 Html.EditorFor() ASP.NET MVC 助手的可空 DateTime

javascript - <input type =“text” maxlength =“4” > 不应将逗号和点计入 maxlength

jquery - Angular 2 + Typescript + jQuery + webpack : $ not defined

c++ - 如何在 if/else 序列中定义未知类型的全局变量?

function - 你能用十个原语实现任何纯 LISP 函数吗? (即没有类型谓词)

sql-server - Varchar 列 : Nullable or not

angular - 如何将 Firebase 中的查询快照转换为不同的对象?

angular - 模块解析失败 : *. ts 意外字符 '@'

c - 预期为 ‘struct matrix_t *’ 但参数的类型为 ‘struct matrix_t *’ ?_?没有不同

C# 8 使用实用方法验证参数