如何在TypeScript中创建stringOf<联合类型>以支持字符串组合匹配
实现包含联合类型所有字符串组合的
stringOf类型 要实现能生成指定字符串联合类型所有非空字符串组合的stringOf<T>类型,可以利用TypeScript的条件类型分发和递归类型特性完成,具体实现如下:
核心实现代码
type stringOf<T extends string> = T extends infer U ? U | `${U}${stringOf<U>}` : never;
代码解释
- 条件类型分发:当
T是字符串联合类型时,T extends infer U会自动将联合类型拆分为单个成员逐一处理,最终将所有成员的处理结果合并为新的联合类型。 - 递归拼接:对于每个成员
U,返回两种情况:- 单个成员本身(长度为1的字符串)
- 当前成员
U与stringOf<U>生成的所有组合拼接,递归生成所有更长的字符串组合(如长度为2、3...的字符串)
验证示例
当使用stringOf<"1" | "2" | "3">时,生成的类型会包含你预期的所有值:"1" | "2" | "3" | "12" | "21" | "22" | "23" | "31" | "32" | "33",同时还会覆盖更长的组合(如"111"、"123"等),完全涵盖所有非空字符串组合。
可选:限制组合长度
如果仅需要指定长度范围内的组合(比如最多2个字符),可以添加长度限制参数:
// 辅助类型:实现数字减1 type Decrement<N extends number> = N extends 1 ? 0 : `${N}` extends `1${infer Rest}` ? `9${Rest}` extends `${infer R}` ? R extends `${number}` ? Decrement<R> : never : never : `${N}` extends `${infer D}${infer Rest}` ? `${D extends 0 ? 9 : D extends `${infer Num extends number}` ? Num - 1 : never}${Rest}` extends `${infer R}` ? R extends `${number}` ? Decrement<R> : never : never : never; // 带长度限制的stringOf type stringOf<T extends string, MaxLength extends number = 2> = MaxLength extends 0 ? never : T extends infer U ? U | `${U}${stringOf<U, Decrement<MaxLength>>}` : never; // 此时resultType仅包含长度1和2的组合 type resultType = stringOf<"1" | "2" | "3">;
内容的提问来源于stack exchange,提问作者Nome A caso
相关产品推荐
相关产品推荐

