Проблема

Реализовать тип Pop<T> который берёт массив T и возвращает новый массив без последнего элемента. Например:

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]

Решение

Разделим массив на две части: всё что идёт от начала до последнего элемента и последний элемент. После, избавимся от последнего элемента и вернём только начало.

Чтобы этого добиться, воспользуемся вариативными типами. Совмещая их с выведением в условных типах, выведем необходимые части массива. В случае, если T присваиваемый к массиву, который можно разбить на две части, возвращаем его первую часть. Иначе, возвращаем never, чтобы отобразить ситуацию, когда задача нерешаемая.

type Pop<T extends any[]> = T extends [...infer H, infer T] ? H : never;

Что почитать