Generic интерфейсы позволяют описывать структуру объектов, типы полей которых могут изменяться в зависимости от контекста использования.
Это фундаментальный инструмент для создания переиспользуемого кода. Классический пример — ответ от сервера, где статус и метаданные одинаковы, а поле data может содержать что угодно:
interface ApiResponse {
status: number;
data: T;
}
В этом уроке мы научимся объявлять такие интерфейсы и применять их для типизации переменных и функций.
- Модуль 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 — ограничения
- Модуль 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. Объявление интерфейса
В этом задании вам предстоит поработать с обобщёнными (generic) интерфейсами в TypeScript. Дан интерфейс Box, который должен быть параметризован типом. Вам необходимо добавить объявление параметра типа (дженерика) после имени интерфейса и использовать этот параметр в качестве типа для поля content. Заполните пропуски в коде так, чтобы интерфейс Box стал обобщённым и корректно типизировал поле content.
interface Box input1S {
content: input2S;
}2. Структура дженерика
Разметьте в приведённом коде TypeScript три ключевых элемента, связанных с дженерик-интерфейсом: параметр типа в объявлении интерфейса, поле, использующее этот параметр типа, и конкретный тип, указанный при создании объекта. Для каждого выделенного фрагмента выберите соответствующий тип из списка: «Параметр типа», «Поле дженерик-типа» или «Конкретный тип».
interface {{Box~|~t1}}<{{T~|~t2}}> {
{{value~|~t3}}: {{T~|~t4}};
}
const {{myBox~|~t5}}: {{Box~|~t6}}<{{number~|~t7}}> = { value: 42 };3. Несоответствие типов
В данном фрагменте кода TypeScript используется generic-интерфейс Box
interface Box<T> { value: T;} let numberBox: Box<number> = { value: "10"};4. Обертка ответа
Из предложенных строк соберите корректную TypeScript-программу, которая объявляет generic-интерфейс ServerResponse с полями success (boolean), data (обобщенный тип) и message (опциональная строка), а затем создает объект myResponse, реализующий этот интерфейс для типа string. Поля в интерфейсе и объекте должны быть объявлены в одинаковом порядке: success, data, message. Лишняя строка в решение не входит.
interface ServerResponse<T> { success: boolean; data: T; message?: string;}const myResponse: ServerResponse<string> = { success: true, data: "Данные успешно получены", message: "Запрос выполнен"};console.log(myResponse);5. Generic vs Static
Перед вами список объявлений интерфейсов на TypeScript. Распределите их по двум категориям: «Дженерик интерфейс» (использует параметр типа, например
interface Box<T> {
value: T;
}interface Person {
name: string;
age: number;
}interface Container<T> {
items: T[];
}interface ResponseData {
status: number;
data: unknown;
}interface Pair<K, V> {
key: K;
value: V;
}interface User {
id: string;
email: string;
}interface Wrapper<T> {
content: T;
timestamp: Date;
}interface Config {
path: string;
debug: boolean;
}