如何在Typescript中处理稀疏数组和未定义数组?

6qfn3psc  于 2022-12-19  发布在  TypeScript
关注(0)|答案(3)|浏览(157)

我现在有一个有“洞”的稀疏数组。考虑一下:

let arr: number[] = []
arr[2] = 5

// arr = [,,5]

我使用第二个数组查找数组中的索引,如下所示:

let indices: number[] = [1, 2]
console.log(
  indices.map(i => arr[i])
    .includes(undefined)
)
// Expected output: true

但是,我得到这个错误:第一个月
我认为这是因为Typescript认为arr只能包含数字,而实际上数组中的“洞”的值为undefined
我可以使用联合类型number | undefined来解决这个问题,但是有更好的方法吗?
我是从Javascript来的,对Typescribe还比较陌生。

flseospp

flseospp1#

TypeScript不知道如何处理稀疏数组,因为它不承认它们的存在。
不过,从我的发现来看,处理这个问题的方法似乎只是按照您的建议来做-将数组键入为(number | undefined)[]

const arr: (number | undefined)[] = []
arr[2] = 5
// arr = [,,5]

const indices: number[] = [1, 2]
console.log(indices.some(i => arr[i] === undefined)) // true

如果你有很多这样的稀疏数组,你可能需要一个SparseArray<T>类型的helper(尽管在大多数情况下它可能没有用):

type SparseArray<T> = (T | undefined)[]
const arr: SparseArray<number> = []
arr[2] = 5
bqf10yzr

bqf10yzr2#

您可以使用some代替includes

indices.map(i => arr[i]).some(x => x === undefined)
kmb7vmvb

kmb7vmvb3#

或者,如果希望所有Array类型都包含undefined值,则只需启用noUncheckedIndexedAccess编译器选项(示例)。

**警告:**由于这会要求集合值周围的类型保护或Assert,从而使类型检查更加严格,因此您可能会收到其他TypeScript错误。

相关问题