Что такое дженерики в TypeScript и для чего они используются
Что проверяют
Умеете ли вы писать переиспользуемый код с сохранением типов, а не подставлять any при первом затруднении.
Как отвечать
Дженерик это параметр типа: функция или тип получает тип как аргумент и сохраняет связь между входом и выходом.
function first<T>(items: T[]): T | undefined {
return items[0];
}
first([1, 2, 3]); // number | undefined, вывод автоматическийБез дженерика пришлось бы писать any и терять проверку на выходе или дублировать функцию под каждый тип.
Что стоит назвать дальше:
- ограничения:
T extends { id: string }разрешает обращаться к полю внутри; - несколько параметров и связи между ними:
function pick<T, K extends keyof T>(obj: T, key: K): T[K]. Здесь тип результата зависит от переданного ключа, и опечатка в ключе становится ошибкой компиляции; - значения по умолчанию:
interface Box<T = string>; - условные и отображённые типы:
Partial<T>,Record<K, V>,ReturnType<F>устроены именно так.
Главный смысл в одной фразе: дженерики сохраняют информацию о типе при прохождении через обобщённый код, а any её выбрасывает.
Где спотыкаются
Пишут <T> там, где параметр используется один раз. Если тип не связывает вход с выходом, дженерик не нужен.
Заменяют дженерик на any при первой ошибке компиляции и теряют весь смысл типизации.
Не знают про keyof и extends и не могут описать функцию, возвращающую значение по ключу объекта.
Забывают, что дженерики стираются при компиляции: проверить T во время выполнения нельзя.