如何实现支持大数的TypeScript Range类型?
实现支持大数范围的TypeScript Range类型
需求背景
需要实现一个TypeScript的Range类型,用于约束变量的数值范围,期望达成以下效果:
type Range<start, end, step extends number = 1> = ? type a1 = Range<1000, 2000>; // 1000 | 1001 | 1002 | ... | 2000 type a2 = Range<1000, 2000, 2>; // 1000 | 1002 | ... | 2000
此前的实现仅能支持1000以内的数值范围,无法覆盖5000及以上的大数场景。
已实现的解决方案
通过社区帮助,已完成支持大数范围的Range类型实现,代码如下:
type _Range< S extends number, E extends number, Step extends number, Acc extends number[] = [], Current extends number = [...Acc, ...{ length: S }]['length'] > = Current extends E ? [...Acc, Current][number] : Current extends infer C extends number ? _Range<S, E, Step, [...Acc, C], [...{ length: C }, ...{ length: Step }]['length']> : never; type Range< S extends number, E extends number, Step extends number = 1 > = S extends E ? S : _Range<S, E, Step>;
该实现可支持数万级的数值范围,但当范围过大时会存在类型计算性能问题,超万级范围的性能优化目前尚未完成。
内容的提问来源于stack exchange,提问作者Autumn
相关产品推荐
相关产品推荐

