Дженерики используют не только функции, но и интерфейсы с типами:
interface Box<T> { value: T; }
const numberBox: Box<number> = { value: 42 }; const textBox: Box<string> = { value: "привет" };
Вы уже встречали дженерики, не зная их имени: Array<T>, Promise<T> (промис, который вернёт T), а в React — useState<T>.
Можно ограничить, какие типы допустимы, через extends:
function len<T extends { length: number }>(x: T): number { return x.length; // у T точно есть length }
len("строка"); // 6 len([1, 2, 3]); // 3
Дженерики — это вершина базового TypeScript: они дают переиспользуемый и при этом строго типизированный код. На старте достаточно понимать идею; глубокое владение приходит с практикой.