Проблема

Реализовать функцию Array.push на уровне системы типов. Например:

type Result = Push<[1, 2], "3">; // [1, 2, '3']

Решение

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

Чтобы взять все элементы из массива, мы можем воспользоваться вариативными типами. Давайте это и сделаем и вернем массив с элементами из массива T:

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

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

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

Теперь, у нас есть копия входного массива T. Единственное, что остается, это добавить к этим элементам элемент U:

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

Таким образом, мы реализовали операцию добавления нового элемента в массив на уровне типов.

Что почитать