IsTuple
Challenge
Implement a type IsTuple, which takes an input type T and returns whether T is tuple type.
For example:
type case1 = IsTuple<[number]>; // true
type case2 = IsTuple<readonly [number]>; // true
type case3 = IsTuple<number[]>; // false
Solution
Zur Lösung dieses Problems können wir einfach prüfen, ob eine Tupel vorliegt, indem wir auf das Vorhandensein einer beliebigen (any) readonly Tupel zu testen.
Wichtig ist hierbei, das any in die Tupel zu schreiben, da es vor der Tupel ein Arraytyp ist. Außerdem kann man bei Tupeltyp ein ? nach dem any ergänzen, um zu signalisieren, dass der Inhalt optional ist.
// Pruefung auf readonly Array => Falsch
type IsTuple<T> = T extends readonly any[] ? true : false;
// Pruefung auf readonly Tupel => Richtig
type IsTuple<T> = T extends readonly [any?] ? true : false;
Nun sind bis auf den never-Testfall alle Fälle abgedeckt. Um auch diesen Test noch abzufertigen, muss man am Anfang des Typen einfach auf ein never prüfen, und falls never vorliegt, false zurückgeben. Wichtig ist hier die Klammern nicht zu vergessen, sonst verhaellt sich never distributiv, und stellt eine leere Vereinigung dar (siehe isnever-Herausforderung).
type IsTuple<T> = [T] extends [never]
? false
: T extends readonly [any?]
? true
: false;