Typescript类型题材 - NumberRange

题目

中文

有时我们需要限制数字的范围...

示例:

type result = NumberRange<2 , 9> //  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

English

Sometimes we want to limit the range of numbers...
For examples.

type result = NumberRange<2 , 9> //  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

答案

type NumberRange<
  L extends number,
  H extends number,
  CArr extends any[] = [],
  OArr extends unknown[] = [unknown],
  R extends number = H
> = H extends CArr['length']
  ? R
  : L extends CArr['length']
  ? NumberRange<OArr['length'], H, [any, ...CArr], [unknown, ...OArr], L | R>
  : NumberRange<L, H, [...CArr, any], [unknown, ...OArr]>;

在线演示

知识点

  • 使用元组的 length 进行计数
  • 将结果保存到泛型参数 R 内, 避免递归层数过多导致 H 超过 50 tsc报 possible infinity loop

参考资料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章