> Как работают type guards в TypeScript (TypeScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Точка, Арго

Стек: TypeScript

> Пример ответа

Type guards в TypeScript - это механизм, который позволяет сужать тип переменной внутри условного блока, обеспечивая более безопасную работу с объединениями (union types) и неизвестными типами (unknown). Они работают за счет анализа контрольного потока (control flow analysis) - компилятор отслеживает, какие проверки были выполнены, и автоматически уточняет тип в соответствующей ветке кода.

Основные виды type guards:

  1. typeof guard - для примитивных типов (string, number, boolean, symbol, undefined, bigint).
    Пример:

    TYPESCRIPT
    function printValue(value: string | number) {
    if (typeof value === 'string') {
    console.log(value.toUpperCase()); // TypeScript знает, что value - string
    } else {
    console.log(value.toFixed(2)); // value - number
    }
    }
  2. instanceof guard - для проверки принадлежности к классу.
    Пример:

    TYPESCRIPT
    class Dog { bark() {} }
    class Cat { meow() {} }
    function makeSound(animal: Dog | Cat) {
    if (animal instanceof Dog) {
    animal.bark(); // animal - Dog
    } else {
    animal.meow(); // animal - Cat
    }
    }
  3. Пользовательские type guards - функции, возвращающие value is Type.
    Пример:

    TYPESCRIPT
    interface Fish { swim(): void }
    interface Bird { fly(): void }
    function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim !== undefined;
    }
    function move(pet: Fish | Bird) {
    if (isFish(pet)) {
    pet.swim(); // pet - Fish
    } else {
    pet.fly(); // pet - Bird
    }
    }
  4. in guard - проверка наличия свойства в объекте.
    Пример:

    TYPESCRIPT
    type A = { a: string };
    type B = { b: number };
    function handle(x: A | B) {
    if ('a' in x) {
    console.log(x.a); // x - A
    }
    }
  5. Дискриминирующие объединения (discriminated unions) - когда тип определяется по литеральному полю.
    Пример:

    TYPESCRIPT
    type Shape =
    | { kind: 'circle'; radius: number }
    | { kind: 'square'; side: number };
    function area(shape: Shape) {
    if (shape.kind === 'circle') {
    return Math.PI * shape.radius ** 2; // shape - circle
    }
    return shape.side ** 2; // shape - square
    }

Type guards критически важны для написания типобезопасного кода: они предотвращают ошибки времени выполнения, позволяя компилятору проверять корректность доступа к свойствам и методам.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью