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

如何判断联合类型变量的具体类型?以coord类型为例

判断coord变量的具体类型并分支处理

首先假设你的Position类型定义类似这样(如果结构不同,调整类型守卫的判断逻辑即可):

interface Position {
  x: number;
  y: number;
}

要区分coord的四种类型,需要结合typeof操作符和自定义类型守卫来做类型判断,具体实现如下:

1. 定义自定义类型守卫

先写两个类型守卫函数,用来识别单个Position和Position数组:

// 判断是否为单个Position
function isPosition(val: unknown): val is Position {
  return (
    typeof val === 'object' &&
    val !== null &&
    typeof (val as Position).x === 'number' &&
    typeof (val as Position).y === 'number'
  );
}

// 判断是否为Position数组
function isPositionArray(val: unknown): val is Position[] {
  return Array.isArray(val) && val.every(item => isPosition(item));
}

2. 分支判断逻辑

通过嵌套判断,依次区分四种类型并执行对应逻辑:

type Coord = number | Position | Position[] | Position[][];

function handleCoord(coord: Coord) {
  // 1. 判断是否为number类型
  if (typeof coord === 'number') {
    console.log('处理number类型');
    // 执行xyz逻辑
    return;
  }

  // 2. 判断是否为单个Position
  if (isPosition(coord)) {
    console.log('处理单个Position');
    // 执行对应逻辑
    return;
  }

  // 3. 判断是否为Position数组(一维)
  if (isPositionArray(coord)) {
    console.log('处理Position[]类型');
    // 执行zyx逻辑
    return;
  }

  // 4. 剩下的就是Position[][]类型
  console.log('处理Position[][]类型');
  // 执行对应逻辑
}

补充说明

  • 如果你的Position结构不同(比如有其他属性),只需要修改isPosition函数里的判断条件即可。
  • 对于数组类型的判断,先通过Array.isArray确认是数组,再通过every检查每个元素的类型,避免空数组的误判(如果空数组需要特殊处理,可以单独加判断)。

内容的提问来源于stack exchange,提问作者pcace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:25:22