TypeScript выводит type parameters из аргументов, протягивая их через цепочку: в map(arr, fn) сначала T из массива, затем U из return fn. Явный generic нужен, когда init/аргумент не представляет полный домен типа.
Разбор
Автовывод:first([1,2,3]) → T = number; писать <number> не нужно.
Forced annotation:create<T>(): T — T не в параметрах → inference пуст → callers обязаны указать тип.
Fetch/API:getJSON<User>(url) — тип ответа не выводится из URL; это утверждение, не проверка.
React:useState<User | null>(null), useState<Task[]>([]) — слабый init требует явного T.
Пример
function map<T, U>(arr: T[], fn: (x: T) => U): U[] {
return arr.map(fn);
}
map([1, 2], n =>`#${n}`); // T=number, U=stringconst [user, setUser] = useState<User | null>(null); // T не выведется из null alone
Итог
Inference — default; явный type argument — когда граница (null, [], внешний API) не несёт полной информации о T.
Как inference проходит через generic-функцию и когда тип нужно указ… · Sobeso