Зачем нужны конструкции с помощью extends в TypeScript?
Продвинутые типы
Ключевое слово `extends` в TypeScript используется в трёх ролях: наследование, ограничение дженериков и условные типы.
Наследование интерфейсов и классов
interface Animal { name: string }
interface Dog extends Animal { breed: string }Ограничение дженерика
function getLength<T extends { length: number }>(value: T) {
return value.length;
}Тип-параметр обязан быть совместим с указанным типом.
Условные типы
type IsString<T> = T extends string ? true : false;
type ElementType<T> = T extends (infer U)[] ? U : T;Позволяют вычислять типы: выбрать вариант, извлечь часть типа через infer, отфильтровать объединение (так работают Exclude, ReturnType, Awaited).
Зачем это нужно
- переиспользовать формы объектов без копирования;
- писать дженерики, которые принимают только подходящие типы;
- строить вычисляемые типы для библиотек и утилит.
Коротко для собеседования
extends — это наследование интерфейсов и классов, ограничение дженериков и условные типы (T extends U ? X : Y) с infer.
Подробнее: TypeScript Handbook — Conditional Types