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

如何在TypeScript中实现数组对象key值唯一的类型检测报错?

在TypeScript中检测数组对象的唯一key并抛出类型错误

可以实现这个需求,但不能直接用普通的Array类型,需要借助TypeScript的泛型、条件类型能力,定义专门的约束类型来检测key的唯一性。

实现方案

先定义辅助类型和核心约束类型:

// 提取数组中所有对象的key,生成去重后的联合类型
type ExtractKeys<T extends Array<{ key: string }>> = T[number]['key'];

// 辅助类型:判断两个类型是否完全相等
type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false;

// 核心类型:检测key是否唯一,不唯一则返回never触发类型错误
type UniqueKeyArray<T extends Array<{ key: string }>> = 
  Equal<ExtractKeys<T>[], [...Set<ExtractKeys<T>>]> extends true
    ? T
    : never;

更易用的使用方式

直接写泛型参数比较繁琐,封装成函数可以自动推导类型:

function createFormArray<T extends Array<{ key: string }>>(
  arr: UniqueKeyArray<T>
): T {
  return arr;
}

// 错误示例:重复key触发类型错误
const a = createFormArray([
  { key: "a1" },
  { key: "a1" } // 报错:类型不兼容,存在重复key
]);

// 正确示例:无重复key正常通过
const b = createFormArray([
  { key: "a1" },
  { key: "a2" }
]);

原理说明

  1. ExtractKeys 提取数组中所有对象的key值,生成联合类型(TypeScript会自动去重重复的联合成员)。
  2. Equal 类型用来判断两个类型是否完全相等,这里对比去重后的key集合和原key数组的类型——一致说明无重复,不一致则存在重复。
  3. UniqueKeyArray 在检测到重复key时返回never,让TypeScript抛出类型错误。

对问题的解答

  • 可以实现要求的效果;
  • 需要定义新的泛型约束类型(UniqueKeyArray),不需要修改key本身的类型(依然是字符串类型);
  • 普通的Array<{key: string}>无法实现,因为它只约束元素结构,不追踪具体值的唯一性。

内容的提问来源于stack exchange,提问作者Koakuma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:28:32