Infer ключове слово в TypeScript — infer TypeScript
infer — це ключове слово в TypeScript, яке використовується для виведення типів в умовних типах. Воно дозволяє TypeScript автоматично виводити типи в залежності від контексту, роблячи код більш гнучким і уникаючи дублювання типів.
infer використовується разом з умовними типами для визначення типу на основі структури іншого типу. Це робить код більш динамічним і зменшує потребу в явному зазначенні типу в деяких ситуаціях.
Як працює infer?
Коли ви використовуєте infer, TypeScript може виводити типи без явного їх зазначення, спираючись на те, як вони використовуються в умовному типі. Це дозволяє створювати більш універсальні та гнучкі типи.
Приклади використання infer
Виведення типу повернення функції
infer часто використовується для витягування типу повернення функції з її типу. Це корисно, коли вам потрібно отримати тип з об'єкта або функції без явного зазначення типу.
type ReturnTypeOfFunction<T> = T extends (...args: any[]) => infer R ? R : never;
function getString(): string {
return "Hello, world!";
}
type Result = ReturnTypeOfFunction<typeof getString>; // stringУ цьому прикладі, використовуючи infer R, TypeScript виводить тип повернення функції getString, який буде string.
ReturnTypeOfFunction<T>— це умовний тип, який перевіряє, чи є тип T функцією. Якщо так, то infer R виводить тип повернення функції.- Тип
Resultбуде string, оскільки функція getString повертає рядок.
Використання infer з масивами
infer також можна використовувати для витягування типів елементів масиву.
type ElementType<T> = T extends (infer U)[] ? U : never;
const numbers: number[] = [1, 2, 3];
type NumberType = ElementType<typeof numbers>; // numberТут тип ElementType<T> перевіряє, чи є тип T масивом. Якщо так, infer U витягує тип елемента масиву (в нашому випадку number).
NumberTypeбуде дорівнюватиnumber, оскільки масивnumbersмістить елементи типу number.
Умовне використання infer в більш складних типах
infer може бути корисним для витягування типів у більш складних типах, таких як об'єкти, класи та інші структури даних.
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type ResolvedType = UnwrapPromise<Promise<string>>; // string
type NonPromiseType = UnwrapPromise<number>; // numberУ цьому прикладі UnwrapPromise<T> — це умовний тип, який витягує тип, на який посилається Promise. Якщо T є Promise, то infer U витягує тип, загорнутий у Promise, в цьому випадку string.
ResolvedTypeбуде дорівнюватиstring, оскількиPromise<string>витягує типstring.NonPromiseTypeзалишається типомnumber, оскількиTне єPromise.
Коли використовувати infer?
- Коли вам потрібно витягнути тип з функції або об'єкта без явного зазначення.
- Для роботи з більш складними типами, такими як масиви, проміси та інші типи, де потрібно витягувати типи елементів.
- Для створення універсальних типів, які можуть адаптуватися до різних ситуацій, допомагаючи уникнути дублювання коду та підвищуючи гнучкість.
Рекомендація:
Використовуйте infer для витягування типів в умовних типах, щоб зробити код більш гнучким і уникнути дублювання. Це особливо корисно при роботі з функціями, масивами та складними типами.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.