«Constraint — нижняя граница возможностей: <T extends { length: number }> пускает всё с length, и в теле можно читать length. Нюанс: constraint фильтрует вход, но не расширяет выведенный тип — строковый литерал остаётся литералом, а не string. Default — другой инструмент: <T = string> срабатывает, когда inference пуст, и только если аргументы не зафиксировали T. Их можно комбинировать. Всё стирается: constraint — compile-time фильтр, не runtime guard; данные с границы системы проверяю кодом.»
Разведите constraint и default; напомните про erased types и runtime validation.