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

參考資料

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