TypeScript — это мощная расширенная версия JavaScript, которая привносит в язык статическую типизацию и расширенные функции. Одной из наиболее интересных особенностей TypeScript является поддержка различающихся объединений, также известных как тегированные объединения или алгебраические типы данных. Дискриминированные объединения позволяют определить тип, который может содержать разные значения на основе дискриминантного свойства. В этой статье блога мы рассмотрим различные методы и приемы эффективного использования дискриминируемых объединений в TypeScript.
-
Определение размеченного объединения:
Чтобы определить размеченное объединение, мы используем оператор объединения (|), чтобы объединить несколько типов в один тип. Каждый тип в объединении должен иметь общее свойство, известное как свойство дискриминанта, которое помогает TypeScript определить, какой конкретный тип используется в данный момент.interface Square { kind: 'square'; size: number; } interface Circle { kind: 'circle'; radius: number; } type Shape = Square | Circle; -
Сопоставление с шаблоном с распознаваемым объединением.
Сопоставление с шаблоном — это метод условной обработки различных случаев распознаваемого объединения. Мы можем использовать оператор переключения в сочетании со свойством дискриминанта для выполнения различных действий в зависимости от текущего типа.function area(shape: Shape): number { switch (shape.kind) { case 'square': return shape.size * shape.size; case 'circle': return Math.PI * shape.radius * shape.radius; } } -
Проверка полноты.
TypeScript обеспечивает проверку полноты, чтобы гарантировать обработку всех возможных случаев распознаваемого объединения. Используя типneverв качестве возвращаемого типа оператора переключателя, TypeScript выдаст ошибку, если какие-либо случаи не будут обработаны.function area(shape: Shape): number { switch (shape.kind) { case 'square': return shape.size * shape.size; case 'circle': return Math.PI * shape.radius * shape.radius; default: const _exhaustiveCheck: never = shape; return _exhaustiveCheck; } } -
Защита типа:
Защита типа позволяет сузить тип переменной внутри условного блока. Они полезны при работе с дискриминируемыми объединениями для выполнения определенных операций на основе текущего типа.function printShapeInfo(shape: Shape): void { if (shape.kind === 'square') { console.log('Square - Size:', shape.size); } else if (shape.kind === 'circle') { console.log('Circle - Radius:', shape.radius); } }
Дискриминированные объединения — это мощная функция TypeScript, которая позволяет работать со сложными структурами данных и обрабатывать различные случаи типобезопасным образом. Используя сопоставление с образцом, проверку полноты и защиту типов, вы можете писать выразительный и надежный код. Начните использовать размеченные объединения в своих проектах TypeScript, чтобы повысить безопасность типов и улучшить читаемость кода.