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
相关产品推荐
相关产品推荐

