Sobes.tech
Middle

Потребявали ли сте дискриминантни юниони и type guards? Кои вградени type guards знаете?

sobes.tech AI

Отговор от AI

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

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

Guards за типове са функции или конструкции, които проверяват типа на променлива по време на изпълнение и ограничават типа за компилатора.

Вградени guards в TypeScript:

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

Пример за дискриминиран съюз и guard за тип:

interface Kvadrat {
  kind: 'square';
  size: number;
}

interface Кръг {
  kind: 'circle';
  radius: number;
}

type Форма = Kvadrat | Кръг;

function площ(форма: Форма): number {
  switch (форма.kind) {
    case 'square':
      return форма.size * форма.size;
    case 'circle':
      return Math.PI * форма.radius ** 2;
  }
}

Тук kind е дискриминатор, а switch действа като guard за тип.

Използване на вградени guards за тип:

function еString(стойност: unknown): стойност е string {
  return typeof стойност === 'string';
}

ifString(нещо)) {
  // тук, `нещо` е от тип string
}