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

能否用TypeScript模板字面量类型描述递归字符串格式?

TypeScript模板字面量类型循环引用问题的解决办法

问题场景

想用TypeScript的模板字面量类型定义类似正则/巴科斯-诺尔范式格式的字符串,写了下面的代码:

type LowercaseLetter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
type UppercaseLetter = Uppercase<LowercaseLetter>;
type Letter = LowercaseLetter | UppercaseLetter;

type Segment = `${Letter}${Segment | ''}`
type Path = `${Segment}${`/${Segment}` | ''}`

结果碰到了循环引用错误:Type alias 'Segment' circularly references itself. (2456),想找个绕开限制的办法。

解决思路

TypeScript不允许直接在模板字面量里递归引用自身,但可以通过条件类型搭配辅助递归类型的方式间接实现这种任意长度的字符串模式。

具体实现

type LowercaseLetter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
type UppercaseLetter = Uppercase<LowercaseLetter>;
type Letter = LowercaseLetter | UppercaseLetter;

// 辅助递归类型:生成空字符串或任意长度的字母序列
type Letters = '' | `${Letter}${Letters}`;

// Segment 要求至少有一个字母,避免空值
type Segment = `${Letter}${Letters}`;

// Path 直接定义合法格式:单个Segment 或者 Segment/segment
type Path = Segment | `${Segment}/${Segment}`;

代码解释

  1. Letters辅助类型:用递归的方式生成空字符串或者「字母+任意字母序列」的组合,作为Segment后续字符的基础,绕开了直接递归的限制。
  2. Segment类型:确保开头必须有一个字母,符合路径段非空的要求。
  3. Path类型:直接枚举两种合法格式,比原写法更直观,也避免了递归引用问题。

验证效果

下面的示例中,合法的路径会通过类型检查,非法的会报错:

// 合法示例
const valid1: Path = "Home";
const valid2: Path = "Home/About";
const valid3: Path = "a/BcEfGh";

// 非法示例(会报错)
// const invalid1: Path = ""; // 空字符串不符合要求
// const invalid2: Path = "123Main"; // 包含非字母字符
// const invalid3: Path = "Products/"; // 结尾不能是斜杠

注意点

TypeScript的递归类型有默认深度限制(大概1000层),但日常业务场景完全够用,除非你需要支持超长字符串,才需要调整编译器配置,一般不用管。

内容的提问来源于stack exchange,提问作者shau-kote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:55:20