Що таке typeguard у TypeScript
TypeGuard — це механізм у TypeScript, який допомагає звужувати тип змінної в межах блоку коду. Це дозволяє TypeScript точно визначати тип змінної на основі умов, роблячи код безпечнішим і дозволяючи компілятору краще перевіряти типи.
TypeGuard використовується для перевірки типу змінної та звуження її типу в конкретному контексті. Це особливо корисно, коли змінна може бути одним з кількох типів, і вам потрібно виконати дії, специфічні для певного типу.
Принцип роботи TypeGuard
TypeScript надає кілька способів реалізації TypeGuard, включаючи:
- Користувацькі функції TypeGuard.
- Оператори перевірки типу такі як
typeofтаinstanceof. - Користувацькі перевірки типу за допомогою
is.
Приклади використання TypeGuard
- Приклад з typeof:
Оператор typeof дозволяє перевіряти примітивні типи, такі як string, number, boolean та інші. У випадку TypeGuard це дозволяє звужувати тип змінної в блоці коду.
function printLength(value: string | number) {
if (typeof value === "string") {
console.log(value.length); // Працює, оскільки value точно є string
} else {
console.log(value.toFixed(2)); // Працює, оскільки value точно є number
}
}
printLength("Hello"); // Вивід: 5
printLength(42); // Вивід: 42.00У цьому прикладі оператор typeof дозволяє TypeScript зрозуміти, що в блоці if змінна value є рядком, а в блоці else — числом.
- Приклад з instanceof:
Оператор instanceof використовується для перевірки типів об'єктів, наприклад, класів. Це дозволяє точно визначити тип об'єкта, якщо він є екземпляром певного класу.
class Dog {
bark() {
console.log("Woof!");
}
}
class Cat {
meow() {
console.log("Meow!");
}
}
function speak(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // Доступ до методу bark, оскільки animal є Dog
} else {
animal.meow(); // Доступ до методу meow, оскільки animal є Cat
}
}
const dog = new Dog();
const cat = new Cat();
speak(dog); // Вивід: Woof!
speak(cat); // Вивід: Meow!- Користувацькі функції TypeGuard
Ви можете створити власні функції для перевірки типу та використання TypeGuard з ключовим словом is.
type Dog = { bark: () => void };
type Cat = { meow: () => void };
function isDog(animal: Dog | Cat): animal is Dog {
return (animal as Dog).bark !== undefined;
}
function speak(animal: Dog | Cat) {
if (isDog(animal)) {
animal.bark(); // animal тепер точно типу `Dog`
} else {
animal.meow(); // animal тепер точно типу `Cat`
}
}
const dog: Dog = { bark: () => console.log("Woof!") };
const cat: Cat = { meow: () => console.log("Meow!") };
speak(dog); // Вивід: Woof!
speak(cat); // Вивід: Meow!Чому використовувати TypeGuard?
- Безпека типів: TypeGuard допомагає уникати помилок, пов'язаних з неправильним використанням змінних, оскільки TypeScript точно розуміє, який тип змінної використовується в кожному блоці коду.
- Покращена читабельність коду: Використання TypeGuard робить код більш зрозумілим і передбачуваним, оскільки він явно вказує, які типи даних обробляються в кожному блоці.
- Краще розуміння коду для IDE: TypeScript та IDE (наприклад, Visual Studio Code) можуть використовувати TypeGuard для покращення підказок, автозаповнення та рефакторингу, що прискорює розробку та покращує роботу з кодом.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.