
Смысл дженериков - писать код, который работает с разными типами данных. Так не придётся дублировать одну и ту же логику для каждого типа.
Но полная свобода в выборе типов может быть излишней. Если функция принимает вообще что угодно (как в случае с [T any]), она становится почти бесполезной - мы ничего не знаем о переданных значениях и непонятно как с ними работать.
Вопрос в том, как найти баланс: сделать ограничения гибкими, чтобы охватить нужные типы, но не слишком широкими, чтобы сохранить полезность.