Typescript如何快速声明10到99的连续字符串字面量联合类型
原有方案失效原因
Array.from 属于运行时动态生成数组的逻辑,TypeScript 无法将它的返回值推导为固定长度的数字字面量元组,即使用 as const 断言也只能得到 readonly number[] 类型,无法提取到10到99的具体数字字面量,因此这个思路无法实现需求。
最优实现方案(适配两位数场景)
由于两位数的结构固定为1-9的十位搭配0-9的个位,直接用模板字面量类型拼接即可,代码简洁无性能问题:
// 十位取值范围1-9 type Tens = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 // 个位取值范围0-9 type Ones = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 // 拼接后自动生成10-99的字符串字面量联合 type TwoDigitString = `${Tens}${Ones}`
你可以直接用 TwoDigitString 作为类型使用,完全符合需求。
通用范围实现方案(适配任意起止数值场景)
如果需要生成任意起止数值的字符串字面量联合,可以用递归类型实现通用工具:
// 生成长度为N的数组 type BuildArr<N extends number, T extends unknown[] = []> = T['length'] extends N ? T : BuildArr<N, [...T, unknown]> // 实现数字加法 type Add<A extends number, B extends number> = [...BuildArr<A>, ...BuildArr<B>]['length'] extends number ? [...BuildArr<A>, ...BuildArr<B>]['length'] : never // 生成从Start到End的数字字面量联合 type NumRange<Start extends number, End extends number, U = never> = Start extends End ? U | Start : NumRange<Add<Start, 1> & number, End, U | Start> // 生成10-99的字符串联合 type TwoDigitString = `${NumRange<10, 99>}`
该方案受TypeScript递归深度限制,适合生成范围长度在1000以内的场景,你的需求长度为90,可正常使用。
内容的提问来源于stack exchange,提问作者crazyones110
相关产品推荐
相关产品推荐

