Number Range

Challenge

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

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

Solution

Zur Lösung dieses Problems definieren wir zuerst einen Hilfstypen NumberPlusOne, der immer einen number literal um eins inkrementiert, da wir in TypeScript keine Operatoren wie + oder - besitzen.

// Inkrementiert eine Zahl um eins => z.b. aus 3 => 4
type NumberPlusOne<
  T extends number,
  Acc extends number[] = []
> = Acc["length"] extends T
  ? [...Acc, 1]["length"]
  : NumberPlusOne<T, [...Acc, 1]>;

Im finalen Typ benötigen wir ebenfalls einen Akkumulator, der alle Zahlen zwischenspeichert. Nun rufen wir den Typ so lange selber auf, bis Lower gleich Upper ist. In jeden Aufruf erhöhen wir Lower mit dem Hilfstyp NumberPlusOne, und fügen den aktuellen Wert für Lower dem Akkumulator hinzu.

type NumberRange<
  Lower extends number,
  Upper extends number,
  Acc extends number[] = []
> = Lower extends Upper
  ? [...Acc, Lower][number]
  : NumberRange<NumberPlusOne<Lower>, Upper, [...Acc, Lower]>;

References