Maximum
Challenge
Description
Implements a type Maximum, get array like type T, and return max value in T
0 <= T[number] < 1000, so nagative number not considered.
If T is a empty array [], just reutrn never
Maximum<[]>; // never
Maximum<[0, 2, 1]>; // 2
Maximum<[1, 20, 200, 150]>; // 200
Advanced
Can you implement type Minimum inspired by Maximum?
Solution
Zur Lösung dieses Problems definieren wir erstmal einen Hilfstypen, mit dessen Hilfe wir zwei Zahlen vergleichen können und der uns zurückliefert, ob die erste Zahl größer als die zweite ist. Die Umsetzung erfolgt mittels eines Akkumulators, den wir so lange mit Zahlen füllen, bis die Länge des Akkumulators entweder T (kleiner) oder U (größer) ist.
type IsGreater<
T extends number,
U extends number,
Acc extends 1[] = []
> = U extends Acc["length"]
? true
: T extends Acc["length"]
? false
: IsGreater<T, U, [...Acc, 1]>;
Nun können wir wieder immer das erste Element aus der Tupel mittels infer extrahieren, und mit dem Hilfstyp prüfen, ob das aktuelle Element größer als das momentan größte Element ist. Falls dies der Fall ist, tauschen wir das TempMax-Element aus und erhalten somit, nach dem wir rekursiv alle Element durchlaufen haben, das größte Element der Tupel.
type Maximum<
T extends number[],
TempMax extends number = T[0]
> = TempMax extends undefined
? never
: T extends [infer H extends number, ...infer R extends number[]]
? IsGreater<H, TempMax> extends true
? Maximum<R, H>
: Maximum<R, TempMax>
: TempMax;