PassFront
  1. PassFront
  2. База знаний
  3. Type Narrowing и Guards

Что такое пользовательские type guards и assertion functions?

Type Narrowing и Guards

Type guard — функция, которая возвращает boolean и сообщает компилятору, как сузить тип, когда результат true.

Предикат типа

interface Cat { meow(): void }
interface Dog { bark(): void }

function isCat(pet: Cat | Dog): pet is Cat {
  return 'meow' in pet;
}

function speak(pet: Cat | Dog) {
  if (isCat(pet)) pet.meow(); // Cat
  else pet.bark();            // Dog
}

Проверка данных с сервера

function isUser(value: unknown): value is { id: number; name: string } {
  return (
    typeof value === 'object' && value !== null &&
    typeof (value as any).id === 'number' &&
    typeof (value as any).name === 'string'
  );
}

Assertion function

Выбрасывает ошибку, если условие не выполнено, и сужает тип после вызова:

function assertDefined<T>(value: T | undefined): asserts value is T {
  if (value === undefined) throw new Error('Value is undefined');
}

Предупреждение

Компилятор верит предикату на слово. Неправильная реализация даст ложную уверенность, поэтому для внешних данных надёжнее схемы валидации (Zod).

Коротко для собеседования

value is T объявляет, что при true значение имеет тип T. Реализация проверки лежит на разработчике.

Другие вопросы раздела