---
sidebar_position: 7
---

# 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 лучше понимал ваши намерения и помогал избегать ошибок.

🚀 **_Источник: DeepSeek_**