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

如何创建Cartesian类型,实现不含同元素组合的字符串笛卡尔积?

实现无重复字符的Cartesian字符串类型

可以实现这样的Cartesian类型,而且不需要先生成所有组合再用Exclude过滤,直接在类型定义阶段就能排除相同字符的组合。

核心实现

type Cartesian<T extends string> = T extends infer U 
  ? U extends string 
    ? Exclude<T, U> extends infer V 
      ? V extends string 
        ? `${U}${V}` 
        : never 
      : never 
    : never 
  : never;

工作原理

  • 借助TypeScript的分布式条件类型,把输入的联合类型T拆分为单个字符串成员U
  • 通过Exclude<T, U>获取联合类型中除了U之外的所有其他成员,记为V
  • 拼接${U}${V},只会生成不同字符的组合,自然规避了aa/bb/cc这类相同字符的情况

测试验证

type TestCartesian = Cartesian<'a' | 'b' | 'c'>;
// 最终类型为:'ab' | 'ac' | 'ba' | 'bc' | 'ca' | 'cb',完全符合需求

补充:事后过滤的方式(不推荐)

如果坚持用先生成所有组合再排除的思路,也可以实现,但需要借助分布式条件类型来精准匹配相同字符的组合:

// 生成所有可能的组合(含相同字符)
type AllPairs<T extends string> = `${T}${T}`;
// 排除两个字符相同的组合
type CartesianExclude<T extends string> = T extends infer U 
  ? U extends string 
    ? Exclude<AllPairs<T>, `${U}${U}`> 
    : never 
  : never;

不过这种方式会先生成冗余的组合再过滤,不如第一种直接生成目标组合的方式高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:22:47