Магічний інструмент TypeScript: чистіший код, менше помилок! 🧰✨

**Якщо ви використовуєте TypeScript, ця стаття обов'язково до прочитання! 🔥 TypeScript має унікальні функції та ключові слова, які допомагають зробити наш код типобезпечним і надійним. У цій статті ми розглянемо їх, разом з відповідними прикладами та фрагментами коду! 😎

pic

Магічний інструмент TypeScript: чистіший код, менше помилок! 🧰✨

Якщо ви використовуєте TypeScript, ця стаття обов'язково до прочитання! 🔥 TypeScript має унікальні функції та ключові слова, які допомагають зробити наш код типобезпечним і надійним. У цій статті ми розглянемо їх, разом з відповідними прикладами та фрагментами коду! 😎

1️⃣ is - Вбудований детектив TypeScript 🕵️‍♂️

В TypeScript, is — це унікальний тип захисту. Він допомагає визначити фактичний тип змінної. Припустимо, у нас є типи Dog та Cat, ми можемо використовувати is, щоб перевірити, до якого типу належить змінна.

Приклад 1: Собака проти Кота 🐶🐱

type Dog = { bark: () => void; };  
type Cat = { meow: () => void; };  

function isDog(pet: Dog | Cat): pet is Dog {  
 return (pet as Dog).bark !== undefined;  
}  

const pet: Dog | Cat = { bark: () => console.log('Woof!') };  

if (isDog(pet)) {  
 pet.bark(); // 🐶 Woof! Woof!  
} else {  
 pet.meow(); // 🐱 Meow!  
}

Ключове слово is зберігає типобезпечність нашого коду та покращує IntelliSense. 🧠✨

Більше прикладів is 🕵️‍♂️

Давайте розглянемо кілька цікавих і практичних прикладів використання ключового слова is! 😊

Приклад 2: Перевірка чисел проти рядків

function isNumber(value: unknown): value is number {  
 return typeof value === 'number';  
}  

const value: unknown = 42;  

if (isNumber(value)) {  
 console.log(value.toFixed(2)); // ✅ Безпечно використовувати як число  
} else {  
 console.log('Not a number');  
}

Тут функція isNumber перевіряє, чи є value числом. Якщо це число, ми можемо безпечно використовувати його. 🎯

Приклад 3: Перевірка кастомних типів

type Admin = { role: 'admin'; permissions: string[] };  
type User = { role: 'user'; username: string };  

function isAdmin(user: Admin | User): user is Admin {  
 return user.role === 'admin';  
}  

const currentUser: Admin | User = { role: 'user', username: 'john_doe' };  

if (isAdmin(currentUser)) {  
 console.log('Admin Permissions:', currentUser.permissions); // ✅ Адмін підтверджений  
} else {  
 console.log('User Name:', currentUser.username); // ✅ Користувач підтверджений  
}

Використовуючи isAdmin, ми перевіряємо, чи є змінна типом Admin. Як тільки тип підтверджено, IntelliSense працює безперебійно. 💻

2️⃣ keyof - Пошук властивостей 🔎

З keyof ми можемо отримати об'єднаний тип всіх властивостей з об'єкта.

Приклад:

type Person = { name: string; age: number; };  
type PersonKeys = keyof Person; // 'name' | 'age'

Тепер PersonKeys може бути лише 'name' або 'age'. Якщо ми зробимо помилку в написанні, TypeScript одразу це виявить! 😅

3️⃣ in - Перевірка наявності ключа 🔑

Оператор in перевіряє, чи існує властивість в об'єкті.

Приклад:

type Dog = { bark: () => void; };  
type Cat = { meow: () => void; };  

function isDog(pet: Dog | Cat): pet is Dog {  
 return 'bark' in pet;  
}  

const pet = { meow: () => console.log('Meow!') };  

if ('bark' in pet) {  
 console.log('It is a Dog!');  
} else {  
 console.log('It is a Cat!'); // 🐱 It is a Cat!  
}

4️⃣ typeof і keyof typeof - Магія типів і ключів ✨

З typeof ми можемо отримати тип змінної, а з keyof typeof — її ключі.

Приклад: Улюблені кольори 🎨

const colors = { red: '#FF0000', green: '#00FF00', blue: '#0000FF' };  
type ColorKeys = keyof typeof colors; // 'red' | 'green' | 'blue'

Тепер ColorKeys гарантує, що ми завжди вибираємо правильний ключ кольору.
Якщо є помилка в написанні, TypeScript нас про це повідомить! 🛑

5️⃣ Pick & Omit - Вибір або виключення властивостей 🍎🍊

  • Pick дозволяє нам вибрати конкретні властивості.
  • Omit дозволяє нам виключити конкретні властивості.

Приклад:

type Person = { name: string; age: number; address: string; };  
type PickedPerson = Pick<Person, 'name' | 'age'>; // { name: string; age: number; }  
type OmittedPerson = Omit<Person, 'address'>; // { name: string; age: number; }

6️⃣ Partial - Зробити все необов'язковим 🍴

Partial робить всі властивості необов'язковими.

Приклад:

type Person = { name: string; age: number; };  
type PartialPerson = Partial<Person>; // { name?: string; age?: number; }

Тепер, в PartialPerson можуть бути відсутні властивості name або age.

7️⃣ Required - Усі властивості мають бути присутні 🙋‍♂️

Required — це протилежність Partial. Всі властивості стають обов'язковими.

Приклад:

type OptionalPerson = { name?: string; age?: number; };  
type RequiredPerson = Required<OptionalPerson>; // { name: string; age: number; }

Тепер, в RequiredPerson повинні бути всі властивості. 😉

8️⃣ Readonly - Без змін 🚫

Readonly робить властивості незмінними.

Приклад:

type Person = { name: string; age: number; };  
type ReadonlyPerson = Readonly<Person>; // { readonly name: string; readonly age: number; }

Тепер властивості в ReadonlyPerson не можна змінювати. 🔒

9️⃣ unknown - Не впевнений, вирішу пізніше 🤔

unknown — це безпечніша версія any. Використовуйте її, коли ви не впевнені в типі.

Приклад:

let value: unknown = 'Hello';  
if (typeof value === 'string') {  
 console.log(value.toUpperCase()); // ✅ Безпечно використовувати  
}

* Бонус: Магія типів 🎩

1️⃣ Exclude - Видалити небажані типи 🚫

Exclude видаляє вказані типи з об'єднання.

Приклад:

type Animal = 'dog' | 'cat' | 'fish';  
type LandAnimal = Exclude<Animal, 'fish'>; // 'dog' | 'cat'

Тепер, LandAnimal містить тільки 'dog' та 'cat'.

2️⃣ Extract - Вибрати тільки те, що потрібно

Extract фільтрує конкретні типи з об'єднання.

Приклад:

type Animal = 'dog' | 'cat' | 'fish';  
type WaterAnimal = Extract<Animal, 'fish'>; // 'fish'

Тепер, WaterAnimal містить тільки 'fish'.

5. Висновок 🏁

Ці чудові можливості TypeScript допомагають зробити наш код типобезпечним, зручним для читання та потужним. 💪

У світі програмування ми можемо робити помилки, але TypeScript рятує нас від цих помилок. Тож, використовуйте TypeScript і насолоджуйтесь програмуванням! 🚀

💬 Яка функція вам найбільше подобається? Поділіться в коментарях!

Перекладено з: The Magic Toolbox of TypeScript: Cleaner Code, Fewer Errors! 🧰✨

Leave a Reply

Your email address will not be published. Required fields are marked *