Как создавать и использовать служебные типы TypeScript

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

Что такое служебные типы TypeScript?

Типы утилит в TypeScript — это предопределенные типы, которые помогают преобразовывать другие типы. Их можно использовать для создания новых типов на основе существующих путем выбора, исключения или изменения свойств. Они играют важную роль в поддержании чистого, повторно используемого кода.

Часто используемые типы утилит TypeScript

Вот некоторые из наиболее часто используемых типов утилит TypeScript:

  • Частичное<T> – делает все свойства типа T необязательными.
  • Обязательно<T> – делает все свойства типа T обязательными.
  • Только для чтения<T> – делает все свойства типа T доступными только для чтения.
  • Pick<T, K> – выбирает набор свойств K из типа T.
  • Исключить<T, K> – Удаляет набор свойств K из типа T.
  • Запись<K, T> – Создает тип объекта с ключами типа K и значениями типа T.

Пример: использование частичного<T>

Тип утилиты Partial делает все свойства интерфейса необязательными. Вот как это можно использовать:

interface User {
  name: string;
  age: number;
  email: string;
}

const updateUser = (user: Partial<User>) => {
  // Update logic
};

updateUser({ name: "John" });

В этом примере updateUser принимает аргумент типа Partial<User>, что означает, что требуются только некоторые свойства интерфейса User.

Пример: использование Pick<T, K>

Тип утилиты Pick позволяет выбрать подмножество свойств из типа:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserContactInfo = Pick<User, "name" | "email">;

const contactInfo: UserContactInfo = {
  name: "John",
  email: "john@example.com"
};

Здесь Pick<User, “name” | “email”> создает новый тип UserContactInfo, содержащий только свойства name и email из исходного интерфейса User.

Пример: использование Omit<T, K>

Тип утилиты Omit удаляет указанные свойства из типа:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserWithoutEmail = Omit<User, "email">;

const user: UserWithoutEmail = {
  name: "John",
  age: 30
};

В этом примере тип UserWithoutEmail создается путем исключения свойства email из интерфейса User.

Создание пользовательских типов утилит

Пользовательские типы утилит также можно создавать с помощью расширенных функций типов TypeScript, таких как условные типы, сопоставленные типы и т. д. Вот простой пример пользовательского типа утилит, который делает все свойства необязательными:

type MyPartial<T> = {
  [P in keyof T]?: T[P];
};

interface User {
  name: string;
  age: number;
  email: string;
}

const user: MyPartial<User> = {
  name: "Alice"
};

Этот пользовательский тип MyPartial функционирует аналогично встроенному служебному типу TypeScript Partial.

Заключение

Типы утилит TypeScript являются важной функцией для гибкой и многократно используемой работы с типами. Используя эти типы утилит, код можно сделать более лаконичным и удобным для поддержки. Независимо от того, используете ли вы встроенные типы утилит, такие как Partial, Pick и Omit, или создаете пользовательские, они значительно улучшают систему типов TypeScript.