如何修改MutuallyExclusive工具类型,为互斥键添加可选性?
修改互斥联合工具类型,将非目标字段设为可选never类型
你可以通过拆分目标字段与非目标字段的映射逻辑,把非目标字段转为可选的never类型,以下是简洁的实现方案:
修改后的工具类型
type MutuallyExclusive<T extends Record<string, any>> = { [K in keyof T]: Pick<T, K> & Partial<Record<Exclude<keyof T, K>, never>>; }[keyof T];
逻辑说明
Pick<T, K>:提取当前遍历到的目标键K,保留原字段的必填性Exclude<keyof T, K>:排除目标键,得到所有非目标字段的集合Record<..., never>:为非目标字段设置never类型Partial<...>:把这些非目标字段转为可选属性- 最后通过交叉类型
&合并两部分,再遍历所有键生成互斥联合类型
验证效果
用你提供的Attributes接口测试:
interface Attributes { id: string; email: string; username: string; } type ExclusiveAttributesResult = MutuallyExclusive<Attributes>;
生成的结果完全符合预期:
type ExclusiveAttributesResult = { id: string; email?: never; username?: never; } | { id?: never; email: string; username?: never; } | { id?: never; email?: never; username: string; }
内容的提问来源于stack exchange,提问作者Mister Epic
相关产品推荐
相关产品推荐

