feat: add mapped types in ts section
This commit is contained in:
116
docs/typescript/07-type-guards.md
Normal file
116
docs/typescript/07-type-guards.md
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
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_**
|
||||
Reference in New Issue
Block a user