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

如何在TypeScript中创建stringOf<联合类型>以支持字符串组合匹配

实现包含联合类型所有字符串组合的stringOf类型

要实现能生成指定字符串联合类型所有非空字符串组合的stringOf<T>类型,可以利用TypeScript的条件类型分发和递归类型特性完成,具体实现如下:

核心实现代码

type stringOf<T extends string> = T extends infer U 
  ? U | `${U}${stringOf<U>}` 
  : never;

代码解释

  1. 条件类型分发:当T是字符串联合类型时,T extends infer U会自动将联合类型拆分为单个成员逐一处理,最终将所有成员的处理结果合并为新的联合类型。
  2. 递归拼接:对于每个成员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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:05:19