如何在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" } ]);
原理说明
ExtractKeys提取数组中所有对象的key值,生成联合类型(TypeScript会自动去重重复的联合成员)。Equal类型用来判断两个类型是否完全相等,这里对比去重后的key集合和原key数组的类型——一致说明无重复,不一致则存在重复。UniqueKeyArray在检测到重复key时返回never,让TypeScript抛出类型错误。
对问题的解答
- 可以实现要求的效果;
- 需要定义新的泛型约束类型(
UniqueKeyArray),不需要修改key本身的类型(依然是字符串类型); - 普通的
Array<{key: string}>无法实现,因为它只约束元素结构,不追踪具体值的唯一性。
内容的提问来源于stack exchange,提问作者Koakuma
相关产品推荐
相关产品推荐

