Готовая формулировка для устного ответа: generics как type-level parameters, inference, правило «нескольких позиций» и стирание в runtime.
Что сказать
«Generics — параметры на уровне типов: функция сохраняет связь между входом и выходом вместо схлопывания в any. first<T>(arr: T[]): T означает, что тип элемента, который вошёл, — тот же, что вернётся, и компилятор выводит T из аргумента, поэтому callers редко пишут тип явно. Я слежу, чтобы type parameter стоял в нескольких связанных позициях — если он один, он ничего не связывает, и лучше взять конкретный тип. И помню, что generics стираются в runtime: отражать T нельзя, runtime-решения нужно принимать по значениям.»
Итог
Короткий связный монолог про связь вход→выход, inference, «запах» одинокого T и стирание типов — закрывает типичный generics-вопрос на middle.