> Как работают type guards в TypeScript (TypeScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Точка, Арго
Стек: TypeScript
> Пример ответа
Type guards в TypeScript - это механизм, который позволяет сужать тип переменной внутри условного блока, обеспечивая более безопасную работу с объединениями (union types) и неизвестными типами (unknown). Они работают за счет анализа контрольного потока (control flow analysis) - компилятор отслеживает, какие проверки были выполнены, и автоматически уточняет тип в соответствующей ветке кода.
Основные виды type guards:
-
typeofguard - для примитивных типов (string,number,boolean,symbol,undefined,bigint).
Пример:TYPESCRIPTfunction printValue(value: string | number) {if (typeof value === 'string') {console.log(value.toUpperCase()); // TypeScript знает, что value - string} else {console.log(value.toFixed(2)); // value - number}} -
instanceofguard - для проверки принадлежности к классу.
Пример:TYPESCRIPTclass Dog { bark() {} }class Cat { meow() {} }function makeSound(animal: Dog | Cat) {if (animal instanceof Dog) {animal.bark(); // animal - Dog} else {animal.meow(); // animal - Cat}} -
Пользовательские type guards - функции, возвращающие
value is Type.
Пример:TYPESCRIPTinterface 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}} -
inguard - проверка наличия свойства в объекте.
Пример:TYPESCRIPTtype A = { a: string };type B = { b: number };function handle(x: A | B) {if ('a' in x) {console.log(x.a); // x - A}} -
Дискриминирующие объединения (discriminated unions) - когда тип определяется по литеральному полю.
Пример:TYPESCRIPTtype 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 критически важны для написания типобезопасного кода: они предотвращают ошибки времени выполнения, позволяя компилятору проверять корректность доступа к свойствам и методам.
> Похожие задачи по frontend
Можно ли объединить несколько типов в один тип в TypeScript и как это сделать?
Как типизировать объект с разными ключами и значениями в TypeScript?
Что делает extends в TypeScript и зачем он нужен?
Что такое операторы Pick, Partial, Omit, Required, NonNullable и Exclude в TypeScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью