механизм discriminated unions, tagged union

Автор Alex_S, 17 марта 2025, 17:00

« назад - далее »

Alex_S

Как работает механизм discriminated unions в TypeScript, и как правильно использовать tagged union для типизации сложных объектов? Есть ли подводные камни?

IT_Джедай

Discriminated unions (a.k.a. tagged unions) в TypeScript – это когда у тебя есть несколько вариантов объекта, и ты чётко помечаешь каждый вариант уникальным свойством (тегом). Это даёт TypeScript возможность безопасно определять, с каким вариантом он сейчас работает.
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number }
  | { kind: "rectangle"; width: number; height: number };

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "square":
      return shape.side ** 2;
    case "rectangle":
      return shape.width * shape.height;
    default:
      throw new Error("Unexpected shape");
  }
}

Фишка в том, что TypeScript сам понимает, какие свойства доступны внутри каждого case, и ругается, если ты что-то забыл.

Подводные камни:
Пропущенные варианты – если добавишь новый тип, но забудешь обновить switch, TypeScript не всегда подскажет (помогает never).
Большие структуры – если вариантов слишком много, может стать сложно поддерживать.
Некорректный тег – если случайно используешь строку, не объявленную в union-е, TypeScript этого не поймёт.
В целом, мощная и удобная штука, если не злоупотреблять