Завдання

Реалізувати функцію 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];

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

Посилання