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

TypeScript如何判断联合类型变量属于Equipment还是WorkCenter

解决方案1:自定义类型守卫(无需修改原有类型定义)

你可以通过带类型谓词的自定义守卫函数实现类型收窄,利用两个类型的必填属性差异判断:Equipment 存在必填属性path,而WorkCenter不存在该属性。
代码示例:

// 定义类型守卫函数
function isEquipment(target: Equipment | WorkCenter): target is Equipment {
  return 'path' in target;
}

// 业务逻辑中使用
if (isEquipment(args)) {
  // 此处 args 会被TS自动收窄为 Equipment 类型,可安全访问独有属性
  console.log(args.machine_id, args.path);
} else {
  // 此处 args 会被自动收窄为 WorkCenter 类型
  console.log(args.children);
}

如果是TS 4.9及以上版本,甚至不用单独封装守卫函数,直接在判断条件中写'path' in args即可完成自动收窄。
注意:不要用machine_id这类可选属性做判断依据,可选属性可能不存在,会导致判断逻辑出错


解决方案2:可辨识联合(适合后续类型迭代扩展)

如果后续还会新增其他联合类型,更易维护的方式是给所有联合类型加统一的字面量类型标签,构成可辨识联合:

// 修改原有类型定义,新增type标签
export type Equipment = {
  type: 'equipment', // 固定字面量值
  id: string;
  name: string;
  path: WorkCenter[];
  // 保留其余原有属性
};

export type WorkCenter = {
  type: 'workCenter', // 固定字面量值
  id: string;
  name: string;
  children?: Equipment[];
  // 保留其余原有属性
};

// 使用时直接判断标签即可
if (args.type === 'equipment') {
  // 自动收窄为Equipment类型
} else {
  // 自动收窄为WorkCenter类型
}

这种方式判断逻辑更直观,也不会因为后续两个类型新增属性导致判断逻辑失效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:15:00