Что такое дискриминированные объединения (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 точно определить, какой тип данных используется, и применить соответствующую логику для вычисления площади.
Дискриминированные объединения делают код более безопасным и удобным для работы с разнородными данными, обеспечивая строгую типизацию и предотвращая ошибки, связанные с неправильной обработкой данных.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться