Проблема

Реализовать типизированную версию Array.unshift(). Например:

type Result = Unshift<[1, 2], 0>; // [0, 1, 2]

Решение

Эта проблема имеет много общего с другой проблемой - Push. Там, мы использовали вариативные типы, чтобы взять все элементы из массива.

В этой проблеме мы делаем то же самое, но в другом порядке. Сначала, давайте возьмем все элементы из входного массива:

type Unshift<T, U> = [...T];

С этим куском кода, мы получаем ошибку компиляции “A rest element type must be an array type”. Починим её, добавив ограничение на тип параметре:

type Unshift<T extends unknown[], U> = [...T];

Теперь у нас есть элементы входного массива в нашем кортеже. Всё что нам нужно это добавить новый элемент в начало кортежа:

type Unshift<T extends unknown[], U> = [U, ...T];

Таким образом, мы реализовали функцию unshift() в системе типов TypeScript!

Что почитать