MinusOne

Challenge

Given a number (always positive) as a type. Your type should return the number decreased by one.

For example:

type Zero = MinusOne<1>; // 0
type FiftyFour = MinusOne<55>; // 54

Solution

Zur Lösung des Problems müssen wir wie bereits in anderen Herausforderungen auch hier einen Akkumulator so lange mit Werten füllen, bis die Länge des Akkumulators + 1 der Länge von T entspricht.

// 1. Durchlauf Acc = [1]
// 2. Durchlauf Acc = [1, 1]
// 3. Durchlauf Acc = [1, 1, 1]

type MinusOne<T extends number, Acc extends number[] = []> =
  // Entspricht die Laenge des Akkumulator-Array plus eines weiteren Elements im Array der Zahl, so gibt man einfach den aktuellen Wert zureuck.
  T extends [...Acc, 1]["length"] ? Acc["length"] : MinusOne<T, [...Acc, 1]>;

References

Inferring Within Conditional Types