Виведення типу з generics
Що таке type inference в контексті generics
Коли ти викликаєш функцію з generic-параметром, TypeScript аналізує передані аргументи і сам підставляє тип замість T (чи інших параметрів).
Тобто тобі не потрібно явно писати <string>, <number> тощо - компілятор робить це автоматично.
Приклад 1: базове виведення типу
function identity<T>(value: T): T {
return value;
}
const a = identity("Hello"); // T = string
const b = identity(42); // T = numberTypeScript бачить, що аргумент "Hello" має тип string,
і підставляє T = string автоматично.
Приклад 2: виведення типу з декількох аргументів
function merge<T, U>(a: T, b: U): T & U {
return Object.assign({}, a, b);
}
const result = merge({ name: "Tim" }, { age: 25 });
// TypeScript виводить T = { name: string }, U = { age: number }
// Результат має тип { name: string; age: number }Тут T і U виведені окремо для кожного аргументу.
TypeScript об'єднує їх через &.
Приклад 3: виведення з контексту (contextual inference)
function wrap<T>(value: T): { data: T } {
return { data: value };
}
const wrapped = wrap({ id: 1, name: "Tim" });
// T = { id: number; name: string }TypeScript "бачить" структуру переданого об'єкта і виводить точний тип.
Приклад 4: часткове виведення (partial inference)
function pair<T, U = string>(first: T, second?: U): [T, U] {
return [first, second as U];
}
const p1 = pair(1); // T = number, U = string (типово)
const p2 = pair(true, false); // T = boolean, U = booleanМожна задати тип за замовчуванням для generic-параметра - тоді він використовується, якщо TypeScript не зміг вивести тип з аргументів.
Приклад 5: виведення типу при поверненні функції
function makeArray<T>(item: T, times: number): T[] {
return Array(times).fill(item);
}
const arr = makeArray(5, 3); // T = number -> number[]Тип T виведений з першого аргументу item.
Приклад 6: коли виведення не працює
function logValue<T>(value: T): void {
console.log(value);
}
logValue(null); // T не може бути виведений точно
logValue(undefined); // те самеУ таких випадках потрібно вказати тип явно:
logValue<string | null>(null);Як працює виведення під капотом
TypeScript застосовує декілька стратегій:
- From arguments -> to type parameters - аналіз аргументів та їхніх типів.
- From return type - якщо тип результату можна обчислити.
- Contextual typing - аналіз контексту, у якому використовується функція.
Приклад контекстного виведення:
const handler = <T>(value: T) => console.log(value);
["a", "b", "c"].forEach(handler);
// TypeScript розуміє, що T = stringПідсумок
| Що робить TS | Приклад | Результат |
|---|---|---|
| Виводить тип з аргументу | identity(42) | T = number |
| Виводить тип з декількох аргументів | merge({a: 1}, {b: 2}) | T = {a: number}, U = {b: number} |
| Застосовує тип за замовчуванням | pair(1) | U = string |
| Контекстне виведення | ["x"].forEach(handler) | T = string |
| Не може вивести тип | logValue(null) | потрібно вказати явно |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.