Изящество и мощь: погружение в TypeScript Utility Types
TypeScript предоставляет глобальные utility types, которые можно использовать для общий преобразований. В этой статье мы рассмотрим большинство утилит с примерами.
Awaited
Awaited<Type> - Позволяет получить тип значения, возвращаемого асинхронной функцией. Он извлекает тип, который оборачивается в Promise, и позволяет описать тип значения, которое будет возвращено при разрешении этого Promise.
Здесь тип Awaited используется для получения типа значения, которое будет возвращено при выполнении асинхронной функции fetchUserData.
Partial
Partial<Type> - Создает тип со всеми свойствами Type, которые становятся необязательными.
В первом примере с объектом user1, компилятор выдаст ошибку из-за того, что мы не заполнили все свойства, которые указали в типе User.
При использовании Partial<User> все свойства типа User стали необязательными.
Required
Required<Type> - Устанавливает все свойства Type обязательными и работает противоположно утилите Partial.
Несмотря на то, что в типе User мы указали все свойства необязательными, мы использовали утилиту Required, которая преобразовала весь тип в обязательный, поэтому компилятор выдаст ошибку если мы не укажем все свойства в объекте.
Readonly
Readonly<Type> - Добавляет флаг readonly ко всем свойствам Type.
Компилятор выдаст ошибку, потому что после преобразования утилитой Readonly все свойства типа Todo стали неизменяемыми.
Record
Record<Keys, Type> - Создает объект, ключи которого являются Keys, а значения свойств Type.
В результате объект dogs будет содержать в себе ключи DogName и значения каждого ключа будут age и weight.
Pick
Pick<Type, Keys> - Создает новый тип, содержащий только указанные свойства Keys из исходного типа Type.
Например мы хотим создать объект только с именем и фамилией. Для этого мы будем использовать Pick, создадим новый тип FullName с этими свойствами.
Таким образом, Pick позволяет создавать новые типы, выбирая только необходимые свойства из исходного типа. Это может быть полезно, например, когда мы хотим передать только определенные свойства объекта в функцию или метод.
Omit
Omit<Type, Keys> - Создает новый тип из полей Type без ключей Keys.
В результате преобразований мы получили новый тип Titles, который содержит только title и sub_title.
Exclude
Exclude<UnionType, ExcludedMembers> - Это тип, который исключает из объединения UnionType все типы, которые содержатся в ExcludedMembers.
Например, если у нас есть объединение типов MyUnion и мы хотим исключить из него типы "null" и "boolean", то мы можем использовать Exclude следующим образом:
В результате получим новое объединение типов MyNewUnion, которое будет содержать только типы string и number.
Extract
Extract<Type, Union> - Позволяет извлекать из объединения типов Union только те типы, которые являются подтипами Type.
В этом примере мы объявляем тип MyUnion, который представляет собой объединение типов string, number и boolean. Затем мы используем утилиту типов Extract, чтобы создать новый тип MyStringOrNumber, который содержит только типы string и number из объединения MyUnion.
NonNullable
NonNullable<Type> - Позволяет создавать новый тип, который исключает значения null и undefined из типа Type.
Мы объявляем тип MyType, который представляет собой объединение типов string, null и undefined. Затем мы используем утилиту типов NonNullable, чтобы создать новый тип MyNonNullType, который содержит только тип string без значений null и undefined.
Parameters
Parameters<Type> - Позволяет извлекать типы параметров функции в виде кортежа.
Мы объявляем функцию myFunction, которая принимает три параметра разных типов. Затем мы используем утилиту типов Parameters, чтобы создать новый тип MyFunctionParams, который содержит типы параметров функции в виде кортежа.
ConstructorParameters
ConstructorParameters<Type> - Позволяет извлекать типы параметров конструктора класса в виде кортежа.
Мы объявляем класс MyClass, который имеет конструктор, принимающий три параметра разных типов. Затем мы используем утилиту типов ConstructorParameters, чтобы создать новый тип MyClassParams, который содержит типы параметров конструктора в виде кортежа.
ReturnType
ReturnType<Type> - Позволяет извлекать тип возвращаемого значения функции.
Мы объявляем функцию myFunction, которая возвращает строку. Затем мы используем утилиту типов ReturnType, чтобы создать новый тип MyFunctionReturnType, который содержит тип возвращаемого значения функции.
InstanceType
InstanceType<Type> - Позволяет извлекать тип экземпляра класса.
Мы объявляем класс MyClass, который имеет свойство name и конструктор, который принимает строку и присваивает ее свойству name. Затем мы используем утилиту типов InstanceType, чтобы создать новый тип MyInstanceType, который содержит тип экземпляра класса.
ThisParameterType
ThisParameterType<Type> - Позволяет извлекать тип this из функции Type.
Первая функция - toHex, мы обозначили, что ее параметр this имеет тип Number.
Вторая функция - numberToString, в параметрах с помощью ThisParameterType мы указали, что параметр n равняется this параметра функции toHex.
OmitThisParameter
OmitThisParameter<Type> - Определяет функцию без типа this.
ThisType<Type>
Добавляет тип this к функции Type.
Заключение
В данной статье мы рассмотрели почти все utility types, конечно, в реальной работе большинство из этого скорее всего вам не пригодится, но для справки и личного роста ознакомиться с существующими утилитами и возможностями TS будет круто. Знания данных утилит помогут вам все больше познавать TS и создавать умные типы для любой ситуации.
Заглядывайте в мой телеграм канал - @days_on_front, там будут другие интересные статьи по TS, фронту и разработке в целом.