Продвинутый Typescript
Теория: Сопоставление типов
Иногда при работе с объектными типами нам нужно избежать дублирования полей и переиспользовать уже существующие поля. В таком случае можно использовать механизм поиска типов Lookup Types:
Конструкция Type[Key] выглядит и работает также, как получение значения объекта по ключу в JavaScript. Разница только в том, что доступ через точку тут не сработает.
Кроме того, Lookup Types позволяет получить объединение типов из объекта по нескольким известным ключам, объединенным с помощью вертикальной черты |:
Чтобы получить объединение всех ключей из объекта, можно использовать оператор keyof. Давайте упростим наш пример:
Обсудим, как не дублировать все поля одного объектного типа в другом типе. Для этого используются два вспомогательных типа:
Pick<Type, Keys>— создает объектный тип с ключамиKeysизTypeOmit<Type, Keys>— создает объектный тип, из которого исключаются ключиKeysизType
Так это выглядит на практике:
В этом примере мы получим один и тот же тип в результате и Pick<Person, 'name' | 'age'>, и Omit<Person, 'location'>.
Все Utility Types в TypeScript написаны с помощью встроенных конструкций. Мы уже изучили достаточно много концепций TypeScript, чтобы начать в них разбираться. Попробуем разобраться, как они реализованы. Изучим этот вопрос на примере типа Pick:
В коде выше мы видим тип Pick<T, K>. Это дженерик с двумя параметрами — T и K. На K мы также наложили ограничение extends keyof T, чтобы параметр K содержал перечисление ключей из T.
Далее с помощью оператора in выполняется перебор по всем элементам перечисления. Каждый полученный элемент становится ключом. Для его значения мы ищем подходящий тип в объектном типе T[P].
Операторы keyof (Lookup Types) и in (Mapped Types) часто идут вместе. С помощью keyof мы получаем доступ ко всем именам свойств объектного типа, а благодаря in можем циклически пройти по всем свойствам. Эти две операции являются ключевыми при создании своих вспомогательных типов при работе с объектными типами данных.





