如何创建仅包含两个TypeScript接口非共享属性的类型
实现TypeScript的XOR类型,提取两个接口的非共享属性
给定两个TypeScript接口:
type I1 = { a: string b: string c: number } type I2 = { a: string b: string d: string }
我们需要实现一个XOR<T1, T2>类型,使其仅包含两个接口的非共享属性,最终期望结果如下:
type Result = XOR<I1, I2> // 期望结果 type Result = { c: number d: string }
解决方案
先定义工具类型提取差异键,再基于差异键构建目标类型:
// 提取两个类型的非共享键 type DiffKeys<T, U> = Exclude<keyof T | keyof U, keyof T & keyof U> // 实现XOR类型 type XOR<T1, T2> = { [K in DiffKeys<T1, T2>]: K extends keyof T1 ? T1[K] : T2[K] }
思路说明
- 筛选差异键:
keyof T | keyof U:获取两个类型所有键的联合集合keyof T & keyof U:获取两个类型的共享键集合Exclude<联合键, 共享键>:从所有键中剔除共享键,得到仅存在于其中一个类型的差异键
- 构建目标类型:
遍历差异键,通过条件判断确定当前键属于哪个类型,取对应的属性类型,最终组合成只包含非共享属性的类型。
验证结果
使用上述类型后:
type Result = XOR<I1, I2> // 实际类型为 { c: number; d: string },完全符合预期
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

