TypeScript - 类型 'never' 上不存在属性'length'



我正在写一个帮助函数来比较TypeScript中的两个数组。

function areArraysEqual(arr1: number[], arr2: number[]): boolean {
if (arr1 || arr2) {
return false;
}
if (arr1 == arr2) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (let i of arr1) {
if (arr1[i] != arr2) {
return false;
}
}
return true;
}

我得到的arr1.lengtharr1.length的误差Property 'length' does not exist on type 'never'.是什么意思?

如果您已将tsconfig中的strictNullChecks设置为true(似乎是这种情况),则无法将nullundefined传递给areArraysEqual。不需要前两个条件在函数体中。您可以这样简化函数:

function areArraysEqual(arr1: number[], arr2: number[]): boolean {
if (arr1.length != arr2.length) {
return false;
}
for (let i of arr1) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}

关于误导性错误——这是因为条件if (arr1 || arr2)总是true,所以函数体的其余部分没有任何功能。因此,typescript将缩小arr1arr2的类型。Typescript将number[]从它们的类型集中删除,因此它们成为空集,即never。类型never没有"长度"。财产。

也正如@Bbrk24在评论中提到的,如果你认为你想传递的数组的大小很大,如果你在函数体的开始检查这个条件,函数可以有更好的性能。

if (arr1 == arr2) {
return true;
}

因为当它们是相同的引用时,不需要经过一个大的for循环。

最新更新