← Назад ко всем вопросам

Что такое дискриминированные объединения (discriminated unions) и как они помогают типизации?

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Зачем это нужно?

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

Как это работает?

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

Пример кода

Рассмотрим пример с формами:

type Circle = {
  kind: 'circle'; // Дискриминатор, уникальное значение для типа Circle
  radius: number; // Уникальное свойство для типа Circle
};
​
type Square = {
  kind: 'square'; // Дискриминатор, уникальное значение для типа Square
  sideLength: number; // Уникальное свойство для типа Square
};
​
type Shape = Circle | Square; // Дискриминированное объединение
​
function getArea(shape: Shape): number {
  switch (shape.kind) { // Используем дискриминатор для определения типа
    case 'circle':
      return Math.PI * shape.radius ** 2; // Вычисляем площадь круга
    case 'square':
      return shape.sideLength ** 2; // Вычисляем площадь квадрата
  }
}

Объяснение кода

  • type Circle и type Square: Определяют два типа данных, каждый из которых имеет уникальное свойство kind, выступающее в роли дискриминатора. Это свойство позволяет различать типы.

  • type Shape: Объединяет Circle и Square в один тип, используя дискриминированное объединение. Это позволяет функции getArea принимать аргумент типа Shape, который может быть либо Circle, либо Square.

  • function getArea(shape: Shape): number: Функция, которая принимает параметр shape типа Shape. Внутри функции используется оператор switch для проверки значения дискриминатора kind. Это позволяет TypeScript точно определить, какой тип данных используется, и применить соответствующую логику для вычисления площади.

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

Тема: TypeScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки