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

Общие сведения о сопоставленных типах

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

type NewType = { [P in keyof ExistingType]: NewProperty };

Здесь ExistingType — это исходный тип, который мы хотим преобразовать, P представляет каждое имя свойства в ExistingType, а NewProperty — это новый тип, который мы хотим присвоить каждому свойству.

Пример 1: Сделать свойства доступными только для чтения

Обычный сценарий — это когда мы хотим сделать определенные свойства объекта доступными только для чтения, предотвращая любые изменения после его инициализации. Сопоставленные типы обеспечивают элегантное решение для этого. Рассмотрим следующий код:

type MutablePerson = {
  name: string;
  age: number;
};

type ImmutablePerson = { readonly [P in keyof MutablePerson]: MutablePerson[P] };

const person: ImmutablePerson = {
  name: "John",
  age: 30,
};

person.name = "Jane"; // Error: Cannot assign to 'name' because it is a read-only property.

В этом примере мы определяем тип MutablePerson с изменяемыми свойствами. Затем мы создаем тип ImmutablePerson, применяя сопоставленный тип, который помечает каждое свойство как readonly. Теперь, когда мы пытаемся изменить свойство name в объекте person, TypeScript выдает ошибку, обеспечивая неизменяемость.

Пример 2. Опциональные свойства

Иногда мы хотим преобразовать тип, сделав некоторые его свойства необязательными. Сопоставленные типы могут помочь нам легко достичь этого. Рассмотрим следующий код:

type RequiredPerson = {
  name: string;
  age: number;
  email: string;
};

type OptionalPerson = { [P in keyof RequiredPerson]?: RequiredPerson[P] };

const person: OptionalPerson = {
  name: "John",
  age: 30,
};

person.email = "[email protected]"; // Optional property assignment allowed.

В этом примере мы определяем тип RequiredPerson со всеми необходимыми свойствами. Используя сопоставленный тип, мы создаем тип OptionalPerson, в котором каждое свойство преобразуется в необязательное свойство. Теперь, когда мы инициализируем объект person, мы можем опустить свойство email или присвоить ему значение позже.

Пример 3: Создание частичных типов

Сопоставленные типы особенно полезны при работе с большими и сложными типами, позволяя нам создавать частичные типы, которые включают только подмножество свойств. Рассмотрим следующий код:

type Person = {
  name: string;
  age: number;
  email: string;
  address: string;
};

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

const partialPerson: PartialPerson<Person> = {
  name: "John",
  age: 30,
};

partialPerson.email = "[email protected]"; // Optional property assignment allowed.
partialPerson.address = "123 Street"; // Optional property assignment allowed.

В этом примере мы определяем тип Person с несколькими свойствами. Затем мы создаем универсальный тип PartialPerson, используя сопоставленный тип. Применяя PartialPerson<Person>, мы можем создать частичный тип, который включает только подмножество свойств исходного типа Person. Это позволяет нам работать с объектами, имеющими необязательные свойства, обеспечивая гибкость при инициализации данных и манипулировании ими.

Сопоставленные типы в TypeScript открывают новое измерение гибкости и выразительности нашего кода. Они позволяют нам преобразовывать типы и манипулировать ими, создавая новые типы на основе существующих. Будь то создание свойств, доступных только для чтения, опционализация свойств или создание частичных типов, сопоставленные типы предлагают элегантные решения различных проблем, связанных с типами.

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

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

Удачного картографирования с TypeScript!