Sobes.tech
Back to questions
Middle
2

Приходилось ли использовать дискриминантные юнионы и type guards? Какие встроенные type guards знаешь?

Companies where asked
UserGate

Answer from AI

sobes.tech AI

Дискриминантные юнионы (discriminated unions) и type guards — мощные инструменты TypeScript для работы с объединениями типов, позволяющие безопасно определять конкретный тип в объединении.

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

Type guards — функции или конструкции, которые проверяют тип переменной во время выполнения и сужают тип для компилятора.

Встроенные type guards в TypeScript:

  • typeof — для примитивов (string, number, boolean)
  • instanceof — для проверки принадлежности к классу
  • in — проверяет наличие свойства в объекте

Пример дискриминантного юниона и type guard:

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 ** 2;
  }
}

Здесь kind — дискриминант, а switch выступает как type guard.

Использование встроенных type guards:

function isString(value: unknown): value is string {
  return typeof value === 'string';
}

if (isString(someVar)) {
  // здесь someVar тип string
}