TypeScript如何实现Record类型字面量值唯一性校验,重复返回never
解决方案
你可以通过新增重复值校验的辅助类型改造原有的RecToDU实现需求,完整代码如下:
// 辅助类型:检测对象的字面量值是否存在重复 type HasDuplicateValues<T extends Record<PropertyKey, unknown>> = { [K in keyof T]: { [K2 in keyof T]: K2 extends K ? never : T[K] extends T[K2] ? true : never }[keyof T] }[keyof T] extends true ? true : false // 改造后的工具类型 export type RecToDU<T extends Record<PropertyKey, unknown>> = HasDuplicateValues<T> extends true ? never : T[keyof T]
效果验证
- 无重复值场景:
const VALUES = { field1: "fieldA", field2: "fieldB", } as const type VALUESLiterals = RecToDU<typeof VALUES> // 类型结果为:"fieldA" | "fieldB"
- 存在重复值场景:
const VALUES = { field1: "fieldA", field2: "fieldB", field3: "fieldA" } as const type VALUESLiterals = RecToDU<typeof VALUES> // 类型结果为:never
实现逻辑
- 辅助类型
HasDuplicateValues通过两层遍历对象的key,比对不同key对应的字面量值是否相等,只要存在任意一对相等的值就返回true - 改造后的
RecToDU会先校验入参对象是否存在重复值,存在则直接返回never,否则返回所有值的联合类型
内容的提问来源于stack exchange,提问作者robkuz
相关产品推荐
相关产品推荐

