Type guards
Type Guards (защитники типов) в TypeScript — это механизм, который позволяет сужать тип переменной внутри блока кода на основе проверки условий. Это помогает TypeScript лучше понимать, с каким типом данных он работает, и обеспечивает безопасность типов.
Зачем нужны Type Guards?
- Сужение типов: TypeScript может автоматически определять тип переменной внутри блока кода после проверки.
- Безопасность типов: Type Guards помогают избежать ошибок, связанных с неправильным использованием типов.
- Улучшение читаемости: Код становится более понятным, так как явно указываются условия для работы с разными типами.
Основные виды Type Guards
1. typeof
Проверяет тип примитивных значений (string, number, boolean, symbol, undefined, object, function).
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
Проверяет, является ли объект экземпляром определенного класса.
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 из типа.
function printLength(value: string | null) {
if (value !== null) {
console.log(value.length); // Тип value: string
}
}
4. Пользовательские Type Guards
Функции, которые возвращают boolean и помогают TypeScript сузить тип.
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. Проверка свойств объекта
Позволяет сузить тип на основе наличия определенного свойства.
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