Я хотел бы начать с того, что делаю эту серию статей, чтобы лучше изучить и понять Typescript, поэтому не стесняйтесь поправлять меня или обращаться ко мне.
Есть много способов получить первый или последний элемент массива, давайте рассмотрим некоторые из них:
const arr = [1, 2, 3, 4, 5];
const first = arr[0];
const last = arr[arr.length - 1]
// or
const [first, ...rest] = arr;
const [...rest, last] = arr;
Для создания наших типов мы будем использовать подход деструктуризации массива
Типы
type First<Type extends unknown[]> = Type extends [infer R, ...unknown[]] ? R : never
type Last<Type extends unknown[]> = Type extends [...unknown[], infer R] ? R : never
Для обоих наших желаемых типов мы следуем одному и тому же принципу, поэтому давайте разберем их по отдельности.
Понимание ключевого слова infer
Ключевое слово infer можно использовать в условии в условном типе, чтобы поместить вычисленный тип в переменную. Эта переменная может затем использоваться в ветвях условного типа.
First<Type extends unknown[]>
по сути, Type расширяет массив неизвестного типа, нам не важен тип, мы просто хотим получить первый/последний элемент.
Type extends [infer R, ...unknown[]] ? R : never
Далее мы проверяем, расширяет ли Type массив с более чем одним элементом, при этом мы выводим тип из первого/последнего разрушаемого элемента, а также получаем остальные. Затем, если проверка пройдена, мы возвращаем первый/последний элемент, иначе возвращаем never (игнорируется TS).
Спасибо!
Вы можете найти меня здесь Мой Твиттер