TypeScript中如何限制函数扩展参数不可重复?
如何在TypeScript中约束函数的Role参数不重复
可以实现,通过TypeScript的泛型和条件类型,我们能在编译阶段约束传入的Role参数不重复。以下是具体实现方案:
实现步骤
定义辅助类型检查唯一性
先创建一个递归的条件类型,用来验证元组中的元素是否存在重复:type NoDuplicates<T extends readonly any[]> = T extends [infer First, ...infer Rest] ? First extends Rest[number] ? never // 存在重复,返回never触发类型错误 : [First, ...NoDuplicates<Rest>] // 无重复,继续检查剩余元素 : T; // 空元组或检查完成,返回原类型为函数添加泛型约束
结合你的Role联合类型,将函数的rest参数约束为经过NoDuplicates检查的元组:type Role = 'ADMIN' | 'GUEST'; function roleMiddleware<T extends Role[]>(...roles: NoDuplicates<T>) { // 业务逻辑示例:运行时可额外做去重或校验 const uniqueRoles = [...new Set(roles)]; console.log('处理角色:', uniqueRoles); }
效果验证
- 合法调用(无重复参数):
roleMiddleware('ADMIN'); // ✅ 编译通过 roleMiddleware('ADMIN', 'GUEST'); // ✅ 编译通过 - 非法调用(重复参数):
roleMiddleware('ADMIN', 'ADMIN'); // ❌ 编译报错:类型不匹配 roleMiddleware('GUEST', 'GUEST'); // ❌ 编译报错:类型不匹配
补充说明
- 这种约束仅在编译阶段生效,如果需要确保运行时的参数唯一性,建议在函数内部通过
Set等方式再次处理。 - 辅助类型
NoDuplicates是通用型的,可复用在其他需要检查元组元素唯一性的场景中。
内容的提问来源于stack exchange,提问作者Ismail_Aj
相关产品推荐
相关产品推荐

