TypeScript 多维数组的严格可为空问题

问题描述 投票:0回答:1

我正在尝试创建一个函数,该函数传递一个数字数组以用作多维数组的访问器。检查中

if (
  someArray[accessors[0]] === null ||
  someArray[accessors[0]][accessors[1]] === null
) return;

给了我一个空异常,表示

someArray[accessors[0]]
可能为空,不允许继续进行空检查,因此在尝试访问超过 if 的数组时,我会得到相同的错误。 someArray 在每个级别都可以为 null (
Array<Array<number | null> | null>
)。

我在更简单的情况下尝试过这个方法,方法是使用变量

someInt = 0
创建一个多维数组并执行相同的操作。对于
let someInt = 0
,它会给出相同的错误。使用
const someInt = 0
,编译得很好。

所以你会认为将函数参数“accessors”更改为只读可以消除错误,因为它应该与 const 相同。将其更改为只读,问题仍然存在。

我在这里做错了什么,还是 TypeScript 的严格可为空有问题?由于各种原因,禁用严格可为空不是一个选项。

typescript
1个回答
0
投票

Type 无法真正跟踪复杂的动态数组访问以达到缩小范围的目的。因此,如果尝试缩小

someArray[accessors[0]]
,这是行不通的。

您可以做的是使用可选的链接运算符

?.
进行钻取。

function foo(
  someArray: Array<Array<number | null> | null>,
  accessors: number[]
) {
  if (someArray[accessors[0]]?.[accessors[1]] === null) return; // fine
  //...
}```

[See playground](https://www.typescriptlang.org/play/?#code/GYVwdgxgLglg9mABMOcAUAoRiDOcC2ApgIIBOpAhgJ4BciZlVAPA9U2CPgEaGmIA+iDgBthAPgFCQosQBosiChAiEceUjjoduvANoBdDAEpEAbwUxgiNHiKsqupSrVwNugAz79AfgB0j5VV1HF0ARi9EAF5oqVETUkIoEFIwAG5EAHoM5BgwQgUs3yKMAF8gA)
© www.soinside.com 2019 - 2024. All rights reserved.