You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:35:23