我正在尝试创建一个函数,该函数传递一个数字数组以用作多维数组的访问器。检查中
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 的严格可为空有问题?由于各种原因,禁用严格可为空不是一个选项。
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)