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];
Таким чином, ми реалізували операцію додавання нового елементу в масив на рівні типів.
Коментарі