Push
Проблема
Реализовать функцию 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];
Таким образом, мы реализовали операцию добавления нового элемента в массив на уровне типов.
Комментарии