TypeScript
January 9, 2024

Изящество и мощь: погружение в TypeScript Utility Types

TypeScript предоставляет глобальные utility types, которые можно использовать для общий преобразований. В этой статье мы рассмотрим большинство утилит с примерами.

Awaited

Awaited<Type> - Позволяет получить тип значения, возвращаемого асинхронной функцией. Он извлекает тип, который оборачивается в Promise, и позволяет описать тип значения, которое будет возвращено при разрешении этого Promise.

Awaited

Здесь тип Awaited используется для получения типа значения, которое будет возвращено при выполнении асинхронной функции fetchUserData.

Partial

Partial<Type> - Создает тип со всеми свойствами Type, которые становятся необязательными.

Partial

В первом примере с объектом user1, компилятор выдаст ошибку из-за того, что мы не заполнили все свойства, которые указали в типе User.

При использовании Partial<User> все свойства типа User стали необязательными.

Required

Required<Type> - Устанавливает все свойства Type обязательными и работает противоположно утилите Partial.

Required

Несмотря на то, что в типе User мы указали все свойства необязательными, мы использовали утилиту Required, которая преобразовала весь тип в обязательный, поэтому компилятор выдаст ошибку если мы не укажем все свойства в объекте.

Readonly

Readonly<Type> - Добавляет флаг readonly ко всем свойствам Type.

Readonly

Компилятор выдаст ошибку, потому что после преобразования утилитой Readonly все свойства типа Todo стали неизменяемыми.

Record

Record<Keys, Type> - Создает объект, ключи которого являются Keys, а значения свойств Type.

Record

В результате объект dogs будет содержать в себе ключи DogName и значения каждого ключа будут age и weight.

Pick

Pick<Type, Keys> - Создает новый тип, содержащий только указанные свойства Keys из исходного типа Type.

Например мы хотим создать объект только с именем и фамилией. Для этого мы будем использовать Pick, создадим новый тип FullName с этими свойствами.

Pick

Таким образом, Pick позволяет создавать новые типы, выбирая только необходимые свойства из исходного типа. Это может быть полезно, например, когда мы хотим передать только определенные свойства объекта в функцию или метод.

Omit

Omit<Type, Keys> - Создает новый тип из полей Type без ключей Keys.

Omit

В результате преобразований мы получили новый тип Titles, который содержит только title и sub_title.

Exclude

Exclude<UnionType, ExcludedMembers> - Это тип, который исключает из объединения UnionType все типы, которые содержатся в ExcludedMembers.

Например, если у нас есть объединение типов MyUnion и мы хотим исключить из него типы "null" и "boolean", то мы можем использовать Exclude следующим образом:

Exclude

В результате получим новое объединение типов MyNewUnion, которое будет содержать только типы string и number.

Extract

Extract<Type, Union> - Позволяет извлекать из объединения типов Union только те типы, которые являются подтипами Type.

Extract

В этом примере мы объявляем тип MyUnion, который представляет собой объединение типов string, number и boolean. Затем мы используем утилиту типов Extract, чтобы создать новый тип MyStringOrNumber, который содержит только типы string и number из объединения MyUnion.

NonNullable

NonNullable<Type> - Позволяет создавать новый тип, который исключает значения null и undefined из типа Type.

NonNullable

Мы объявляем тип MyType, который представляет собой объединение типов string, null и undefined. Затем мы используем утилиту типов NonNullable, чтобы создать новый тип MyNonNullType, который содержит только тип string без значений null и undefined.

Parameters

Parameters<Type> - Позволяет извлекать типы параметров функции в виде кортежа.

Parameters

Мы объявляем функцию myFunction, которая принимает три параметра разных типов. Затем мы используем утилиту типов Parameters, чтобы создать новый тип MyFunctionParams, который содержит типы параметров функции в виде кортежа.

ConstructorParameters

ConstructorParameters<Type> - Позволяет извлекать типы параметров конструктора класса в виде кортежа.

ConstructorParameters

Мы объявляем класс MyClass, который имеет конструктор, принимающий три параметра разных типов. Затем мы используем утилиту типов ConstructorParameters, чтобы создать новый тип MyClassParams, который содержит типы параметров конструктора в виде кортежа.

ReturnType

ReturnType<Type> - Позволяет извлекать тип возвращаемого значения функции.

ReturnType

Мы объявляем функцию myFunction, которая возвращает строку. Затем мы используем утилиту типов ReturnType, чтобы создать новый тип MyFunctionReturnType, который содержит тип возвращаемого значения функции.

InstanceType

InstanceType<Type> - Позволяет извлекать тип экземпляра класса.

InstanceType

Мы объявляем класс MyClass, который имеет свойство name и конструктор, который принимает строку и присваивает ее свойству name. Затем мы используем утилиту типов InstanceType, чтобы создать новый тип MyInstanceType, который содержит тип экземпляра класса.

ThisParameterType

ThisParameterType<Type> - Позволяет извлекать тип this из функции Type.

ThisParameterType

Мы объявили две функции:

Первая функция - toHex, мы обозначили, что ее параметр this имеет тип Number.

Вторая функция - numberToString, в параметрах с помощью ThisParameterType мы указали, что параметр n равняется this параметра функции toHex.

OmitThisParameter

OmitThisParameter<Type> - Определяет функцию без типа this.

OmitThisParameter

ThisType<Type>

Добавляет тип this к функции Type.

ThisType

Заключение

В данной статье мы рассмотрели почти все utility types, конечно, в реальной работе большинство из этого скорее всего вам не пригодится, но для справки и личного роста ознакомиться с существующими утилитами и возможностями TS будет круто. Знания данных утилит помогут вам все больше познавать TS и создавать умные типы для любой ситуации.

Заглядывайте в мой телеграм канал - @days_on_front, там будут другие интересные статьи по TS, фронту и разработке в целом.

Буду рад обратной связи. Спасибо за внимание!