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

如何在TypeScript中定义递归字符串字面量类型,解决循环引用报错

报错原因

TypeScript 不支持类型别名直接在模板字面量的最右侧递归引用自身,你编写的ML类型在${M}:${ML}分支中将自身放在模板字面量末尾,属于不被允许的循环引用场景,因此会抛出循环引用错误。

可行替代实现

可以通过递归条件类型配合模板字面量推断实现需求,同时可以手动限制最大支持的数字段数避免无限递归,常规场景下设置最大10段、20段完全足够使用:

// 定义单段数字的类型,排除空值
type NumberSegment = `${number}`
// 递归实现冒号分隔数字串,默认最大支持10段,可通过调整MaxDepth的数组长度自定义上限
type ColonSeparatedNums<
  T extends string = NumberSegment, 
  MaxDepth extends any[] = [1,2,3,4,5,6,7,8,9,10]
> = MaxDepth extends [infer _, ...infer Rest]
  ? T | `${T}:${ColonSeparatedNums<T, Rest>}`
  : never

效果验证

// 合法用例无报错
const case1: ColonSeparatedNums = '39:4893:30423'
const case2: ColonSeparatedNums = '232'
const case3: ColonSeparatedNums = '32:39'

// 非法用例触发类型错误
const err1: ColonSeparatedNums = '32:abc'
const err2: ColonSeparatedNums = '32::43'
const err3: ColonSeparatedNums = ':233'

如果需要支持空串,直接在类型定义中补充空分支即可:

type ColonSeparatedNumsAllowEmpty = '' | ColonSeparatedNums

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:03