我正在写一个帮助函数来比较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.length
和arr1.length
的误差Property 'length' does not exist on type 'never'.
是什么意思?
如果您已将tsconfig中的strictNullChecks
设置为true
(似乎是这种情况),则无法将null
或undefined
传递给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将缩小arr1
和arr2
的类型。Typescript将number[]
从它们的类型集中删除,因此它们成为空集,即never
。类型never
没有"长度"。财产。
也正如@Bbrk24在评论中提到的,如果你认为你想传递的数组的大小很大,如果你在函数体的开始检查这个条件,函数可以有更好的性能。
if (arr1 == arr2) {
return true;
}
因为当它们是相同的引用时,不需要经过一个大的for
循环。