如何创建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
相关产品推荐
相关产品推荐

