--- sidebar_position: 5 --- # Type guards **Type Guards (защитники типов)** в TypeScript — это механизм, который позволяет сужать тип переменной внутри блока кода на основе проверки условий. Это помогает TypeScript лучше понимать, с каким типом данных он работает, и обеспечивает безопасность типов. ## Зачем нужны Type Guards? - **Сужение типов:** TypeScript может автоматически определять тип переменной внутри блока кода после проверки. - **Безопасность типов:** Type Guards помогают избежать ошибок, связанных с неправильным использованием типов. - **Улучшение читаемости:** Код становится более понятным, так как явно указываются условия для работы с разными типами. ## Основные виды Type Guards ### 1. `typeof` Проверяет тип примитивных значений (string, number, boolean, symbol, undefined, object, function). ```ts function printValue(value: string | number) { if (typeof value === "string") { console.log(value.toUpperCase()); // Тип value: string } else { console.log(value.toFixed(2)); // Тип value: number } } ``` ### 2. `instanceof` Проверяет, является ли объект экземпляром определенного класса. ```ts class Dog { bark() { console.log("Woof!"); } } class Cat { meow() { console.log("Meow!"); } } function makeSound(animal: Dog | Cat) { if (animal instanceof Dog) { animal.bark(); // Тип animal: Dog } else { animal.meow(); // Тип animal: Cat } } ``` ### 3. Проверка на `null` или `undefined` Позволяет исключить `null` или `undefined` из типа. ```ts function printLength(value: string | null) { if (value !== null) { console.log(value.length); // Тип value: string } } ``` ### 4. Пользовательские Type Guards Функции, которые возвращают **`boolean`** и помогают TypeScript сузить тип. ```ts interface Bird { fly(): void; } interface Fish { swim(): void; } function isFish(pet: Bird | Fish): pet is Fish { return (pet as Fish).swim !== undefined; } function move(pet: Bird | Fish) { if (isFish(pet)) { pet.swim(); // Тип pet: Fish } else { pet.fly(); // Тип pet: Bird } } ``` Обратите внимание на синтаксис **`pet is Fish`**. Это указывает TypeScript, что если функция возвращает **`true`**, то **`pet`** имеет тип **`Fish`**. ### 5. Проверка свойств объекта Позволяет сузить тип на основе наличия определенного свойства. ```ts interface Car { drive(): void; } interface Boat { sail(): void; } function move(vehicle: Car | Boat) { if ("drive" in vehicle) { vehicle.drive(); // Тип vehicle: Car } else { vehicle.sail(); // Тип vehicle: Boat } } ``` ## Итог **Type Guards** — это мощный инструмент TypeScript для работы с типами. Они позволяют: - Сужать типы на основе условий. - Повышать безопасность кода. - Делать код более читаемым и выразительным. Используйте **Type Guards**, чтобы TypeScript лучше понимал ваши намерения и помогал избегать ошибок.