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

