Generics параметризуют тип и сохраняют связь вход→выход: first<T>(arr: T[]): T вернёт number для number[], а не any. any принимает всё и забывает тип — дыра расползается по коду.
Разбор
Без generics у «первого элемента массива» два плохих пути: any[] (нет безопасности) или overload на каждый тип (не поддерживается). Generic — один контракт, inference подставляет T при вызове.
any: compiles всё, crashes в runtime, заражает downstream.
Generic: тот же DX «работает с чем угодно», но компилятор помнит конкретный тип.
Пример
functionfirstBad(arr: any[]): any { return arr[0]; }
const x = firstBad([1, 2]); // x: anyfunction firstGood<T>(arr: T[]): T | undefined { return arr[0]; }
const y = firstGood([1, 2, 3]); // number | undefined
Итог
Generics — безопасная альтернатива any для переиспользуемого кода: принимают разные типы, но не теряют информацию о текущем вызове.
Что такое generics и почему они лучше `any` для переиспользуемых фу… · Sobeso