如何判断联合类型变量的具体类型?以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
相关产品推荐
相关产品推荐

