Pop
Challenge
TypeScript 4.0 is recommended in this challenge
Implement a generic Pop<T> that takes an Array T and returns an Array without it’s last element.
For example
type arr1 = ["a", "b", "c", "d"];
type arr2 = [3, 2, 1];
type re1 = Pop<arr1>; // expected to be ['a', 'b', 'c']
type re2 = Pop<arr2>; // expected to be [3, 2]
Extra: Similarly, can you implement Shift, Push and Unshift as well?
Solution
Zur Lösung dieses Problems müssen wir den Array-Typ in zwei Teile aufteilen: Alle vom Anfang des Arrays bis zum letzten Element und das letzte Element selbst. Danach können wir das letzte Element loswerden und den anderen Teil zurückgeben.
Hierzu nutzen wir wieder variadic tuple types sowie infer. Sollte der Array nicht in zwei Teile aufgeteilt werden können, so geben wir never zurück.
type Pop<T extends any[]> = T extends [...infer H, infer Last] ? [...H] : T;
Weitere Array-Methoden als TypeScript-Typen:
type Push<T extends any[], U> = [...T, U];
type Shift<T extends any[], U> = T extends [...infer H, infer Last]
? [...Last]
: T;
type Unshift<T extends any[], U> = [U, ...T];