Вступ до TypeScript Type Guards
Захист типів — це потужна функція у TypeScript, яка дозволяє розробникам виконувати перевірки під час виконання, щоб звузити тип змінної. Це забезпечує більш точну інформацію про тип, що веде до безпечнішого та більш передбачуваного коду. У цій статті досліджується, що таке охоронці та як їх ефективно використовувати.
Що таке Type Guards?
Захисники типу — це вирази, які виконують перевірки під час виконання та дозволяють TypeScript виводити більш конкретний тип для змінної. Вони допомагають розрізняти різні типи, особливо коли йдеться про типи профспілок. Типові огородження можна реалізувати за допомогою різних методів, зокрема:
- Визначені користувачем предикати типу
- Тип твердження
- Інстанційні перевірки
- Використання оператора
typeof
- Використання оператора
in
Визначені користувачем предикати типу
Предикати типу, визначені користувачем, — це функції, які повертають логічне значення та мають спеціальний тип повернення, який вказує тип змінної, що перевіряється. Ось як їх створити та використовувати:
function isString(value: any): value is string {
return typeof value === 'string';
}
function printString(value: any) {
if (isString(value)) {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log('Not a string');
}
}
У наведеному вище прикладі isString
— це визначений користувачем предикат типу, який допомагає TypeScript зрозуміти, що value
— це рядок у блоці if
.
Твердження типу
Твердження типу вказують TypeScript розглядати змінну як певний тип. Цей метод не виконує перевірку під час виконання, але інформує компілятор TypeScript про тип. Наприклад:
function printLength(value: any) {
console.log((value as string).length); // Assert value is a string
}
У цьому прикладі value як рядок
повідомляє TypeScript вважати, що value
є рядком без виконання перевірки під час виконання.
Інстанційні перевірки
Перевірки екземплярів використовуються, щоб визначити, чи є об’єкт екземпляром певного класу. Це корисно для звуження типів під час роботи з класами:
class Dog {
bark() { console.log('Woof'); }
}
class Cat {
meow() { console.log('Meow'); }
}
function speak(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript knows animal is a Dog here
} else {
animal.meow(); // TypeScript knows animal is a Cat here
}
}
У цьому прикладі оператор instanceof
допомагає TypeScript визначити тип animal
на основі його класу.
Використання оператора typeof
Оператор typeof
можна використовувати для перевірки примітивних типів, таких як string
, number
і boolean
:
function processValue(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log(value.toFixed(2)); // TypeScript knows value is a number here
}
}
Тут typeof
використовується для перевірки, чи value
є рядком
або числом
, і відповідно звужує тип.
Використання оператора in
Оператор in
перевіряє наявність властивості в об’єкта. Це корисно для розрізнення типів, які мають спільні властивості:
interface Bird {
fly: () => void;
}
interface Fish {
swim: () => void;
}
function move(creature: Bird | Fish) {
if ('fly' in creature) {
creature.fly(); // TypeScript knows creature is a Bird here
} else {
creature.swim(); // TypeScript knows creature is a Fish here
}
}
У цьому прикладі оператор in
допомагає TypeScript визначити, чи є creature
Bird
чи Fish
на основі наявності методу.
Висновок
Захисники типів TypeScript є важливими інструментами для гнучкої та безпечної роботи з типами. Вони дозволяють точніше перевіряти тип і можуть запобігати помилкам під час виконання, забезпечуючи використання правильного типу в різних сценаріях. Розуміння та ефективне використання засобів захисту типів може призвести до більш надійного та придатного для обслуговування коду TypeScript.