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

TypeScript中如何限制函数扩展参数不可重复?

如何在TypeScript中约束函数的Role参数不重复

可以实现,通过TypeScript的泛型和条件类型,我们能在编译阶段约束传入的Role参数不重复。以下是具体实现方案:

实现步骤

  1. 定义辅助类型检查唯一性
    先创建一个递归的条件类型,用来验证元组中的元素是否存在重复:

    type NoDuplicates<T extends readonly any[]> = 
      T extends [infer First, ...infer Rest]
        ? First extends Rest[number]
          ? never // 存在重复,返回never触发类型错误
          : [First, ...NoDuplicates<Rest>] // 无重复,继续检查剩余元素
        : T; // 空元组或检查完成,返回原类型
    
  2. 为函数添加泛型约束
    结合你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:50:50