Shift
Завдання
Реалізуйте типізовану версію Array.shift()
. Наприклад:
type Result = Shift<[3, 2, 1]>; // [2, 1]
Розв’язок
Ще одне завдання в основі якого маніпулювання кортежами. У цьому випадку нам потрібно розділити елемент з початку кортежу та решту - хвіст. Починаємо з порожнього типу:
type Shift<T> = any;
Щоб отримати перший елемент кортежу та його решту, ми можемо використати виведення в умовних типах:
type Shift<T> = T extends [infer _, ...infer T] ? never : never;
Перший елемент називається _
, тому що він для нас не важливий. Однак нам
важлива решту кортежу, яка є “зміщеною”. Таким чином, ми повертаємо його з
правдивої гілки умовного типу:
type Shift<T> = T extends [infer _, ...infer T] ? T : never;
Якщо тип-параметр T
не відповідає заданому шаблону, повертаємо порожній
кортеж, оскільки немає що зміщувати:
type Shift<T> = T extends [infer _, ...infer T] ? T : [];
Коментарі