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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:09:00