如何区分SomeType[]与SomeType[][]?函数内判断参数类型方法
一维数组SomeType[]与二维数组SomeType[][]的区别
- 结构差异:
一维数组是单层元素集合,每个成员都是SomeType类型的值;二维数组是「数组的数组」,每个成员本身就是一个SomeType[]类型的一维数组。示例:// 一维数组:直接存储SomeType类型元素 const oneDArr: SomeType[] = [item1, item2, item3]; // 二维数组:每个元素是一维数组 const twoDArr: SomeType[][] = [[item1, item2], [item3, item4]]; - 元素访问方式:
一维数组只需单个索引就能获取SomeType类型元素,比如oneDArr[0];二维数组需要两层索引,twoDArr[0][1]才是SomeType类型的值,直接取twoDArr[0]得到的是一个一维数组。 - 适用场景:
一维数组适合存储线性结构的数据,比如一组用户ID、一串温度数值;二维数组更适合有行列层级的数据,比如表格内容、数学矩阵。
在函数中区分参数的两种数组类型
因为参数是SomeType[] | SomeType[][]联合类型,我们可以用类型守卫在函数体内缩小类型范围,常见实现方式有两种:
方式一:自定义类型守卫(复用性强)
先定义一个类型谓词函数,专门判断是否为二维数组:
function isTwoDimensionalArray(arr: SomeType[] | SomeType[][]): arr is SomeType[][] { // 非空数组时检查第一个元素是否为数组;空数组默认判定为一维(可根据业务调整逻辑) return arr.length > 0 && Array.isArray(arr[0]); }
然后在函数中使用这个守卫:
someFunction(someParameter: SomeType[] | SomeType[][]) { if (isTwoDimensionalArray(someParameter)) { // TypeScript自动推断someParameter为SomeType[][] someParameter.forEach(subArray => { subArray.forEach(item => { // 处理单个SomeType类型元素 }); }); } else { // TypeScript自动推断someParameter为SomeType[] someParameter.forEach(item => { // 处理单个SomeType类型元素 }); } }
方式二:直接在函数内判断(快速实现)
如果不需要复用判断逻辑,也可以直接在函数体内做检查:
someFunction(someParameter: SomeType[] | SomeType[][]) { if (someParameter.length > 0 && Array.isArray(someParameter[0])) { // 二维数组处理逻辑 someParameter.forEach(subArr => { /* ... */ }); } else { // 一维数组处理逻辑 someParameter.forEach(item => { /* ... */ }); } }
注意事项
如果SomeType本身有可能是数组类型,上面的判断会失效。这种情况下需要结合SomeType的具体特征区分,比如如果SomeType是对象,就检查元素是否包含对象的专属属性,而非数组属性。
内容的提问来源于stack exchange,提问作者PFidalgo
相关产品推荐
相关产品推荐

