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

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]

效果验证

  1. 无重复值场景:
const VALUES = {
    field1: "fieldA",
    field2: "fieldB",
} as const

type VALUESLiterals = RecToDU<typeof VALUES>
// 类型结果为:"fieldA" | "fieldB"
  1. 存在重复值场景:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:54:03