В TypeScript Generics (Обобщения) по умолчанию могут принимать любой тип. Однако иногда нам нужно работать со свойствами, которые присущи только определенному набору типов (например, свойство .length у массивов и строк). Для этого используются Generic Constraints (Ограничения обобщений).
Ключевое слово extends позволяет сузить допустимый диапазон типов. Синтаксис: . Это говорит компилятору: «Тип T может быть любым, но он обязан иметь структуру, совместимую с SomeInterface». Если попытаться передать тип, не удовлетворяющий ограничению, TypeScript выдаст ошибку. Это делает код более безопасным и предсказуемым, позволяя обращаться к свойствам ограничения внутри функции.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Generic Constraints (extends).
- Использование keyof с Generics.
- Значения по умолчанию для Generic.
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Ключевое слово ограничения
В этом задании вам нужно дополнить объявление обобщённой функции, которая работает с объектами, имеющими свойство `id`. Для корректной типизации необходимо ограничить тип-параметр, чтобы он гарантированно содержал поле `id` определённого типа. Впишите в указанное место ключевое слово, которое в TypeScript используется для наложения ограничений на дженерики. После правильного заполнения пропуска функция сможет принимать только объекты с `id: number` и выводить значение этого идентификатора.
function printId<T input1S { id: number }>(obj: T): void {
console.log(obj.id);
}
const user = { id: 42, name: 'Alice' };
printId(user);2. Разметка ограничения
Разметьте сигнатуру функции с ограничением обобщённого типа (generic constraint) в TypeScript. Укажите для каждого выделенного фрагмента, является ли он параметром типа (T), ключевым словом ограничения (extends) или типом-ограничением (интерфейсом). Это упражнение поможет закрепить понимание синтаксиса ограничений в дженериках.
function logLength<{{T~|~t1}} {{extends~|~t2}} {{Lengthwise~|~t3}}>(arg: T): void {
console.log(arg.length);
}3. Доступ к свойству без ограничения
В этом фрагменте кода TypeScript определена обобщённая функция, которая пытается получить доступ к свойству .value у объекта типа T. Однако в сигнатуре функции отсутствует необходимое ограничение, что приводит к ошибке компиляции. Исправьте объявление функции, добавив ограничение на тип T, чтобы гарантировать наличие свойства value.
function getValue<T>(obj: T): any { return obj.value;} const num = getValue({ value: 42 });console.log(num);4. Выбор правильного интерфейса
В этом задании вам предстоит дополнить код функции, которая выводит имя пользователя. Для этого необходимо выбрать подходящий интерфейс для ограничения дженерика (extends), чтобы гарантировать наличие поля 'name' у передаваемого объекта. Также нужно указать, какое свойство следует выводить. Используйте выпадающие списки для заполнения пропусков в коде.
interface Person {
name: string;
age: number;
}
interface Animal {
species: string;
}
interface Named {
name: string;
}
function printName<T extends input1S>(obj: T): void {
console.log(obj.input2S);
}
const user = { name: 'Alice', age: 30 };
printName(user);5. Логика проверки ограничения
Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов, которые выполняет компилятор при вызове функции с ограниченным дженериком (generic constraint). Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить процесс проверки типа и выполнения функции.
interface HasLength {
length: number;
}
function getLength<T extends HasLength>(obj: T): number {
return obj.length;
}
const result = getLength("TypeScript");
console.log(result);6. Сборка функции с ограничением
Из предложенных строк соберите корректную сигнатуру стрелочной функции на TypeScript, которая использует дженерик T, ограниченный типами number или string (включая строковые литералы). Функция должна принимать параметр типа T и возвращать значение того же типа. Игнорируйте лишние строки, которые нарушают ограничение или используют неправильный синтаксис.
const myFunc = <T extends string | number>(value: T): T =>value;const myFunc = <T>(value: T): T =>const myFunc = <T extends boolean>(value: any): any =>