Generic интерфейсы

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Generic интерфейсы позволяют описывать структуру объектов, типы полей которых могут изменяться в зависимости от контекста использования.

Это фундаментальный инструмент для создания переиспользуемого кода. Классический пример — ответ от сервера, где статус и метаданные одинаковы, а поле data может содержать что угодно:

interface ApiResponse {
  status: number;
  data: T;
}

В этом уроке мы научимся объявлять такие интерфейсы и применять их для типизации переменных и функций.

Список тем

1. Объявление интерфейса

id: 40713_gi_01_def

В этом задании вам предстоит поработать с обобщёнными (generic) интерфейсами в TypeScript. Дан интерфейс Box, который должен быть параметризован типом. Вам необходимо добавить объявление параметра типа (дженерика) после имени интерфейса и использовать этот параметр в качестве типа для поля content. Заполните пропуски в коде так, чтобы интерфейс Box стал обобщённым и корректно типизировал поле content.

Заполните пропуски
interface Box input1S {
    content: input2S;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Структура дженерика

id: 40713_gi_03_highlight

Разметьте в приведённом коде TypeScript три ключевых элемента, связанных с дженерик-интерфейсом: параметр типа в объявлении интерфейса, поле, использующее этот параметр типа, и конкретный тип, указанный при создании объекта. Для каждого выделенного фрагмента выберите соответствующий тип из списка: «Параметр типа», «Поле дженерик-типа» или «Конкретный тип».

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
interface {{Box~|~t1}}<{{T~|~t2}}> {
  {{value~|~t3}}: {{T~|~t4}};
}

const {{myBox~|~t5}}: {{Box~|~t6}}<{{number~|~t7}}> = { value: 42 };
Конкретный тип
Параметр типа
Поле дженерик-типа
Сообщения
Проверить
Показать подсказку

3. Несоответствие типов

id: 40713_gi_04_error

В данном фрагменте кода TypeScript используется generic-интерфейс Box, но допущена ошибка, связанная с несоответствием типов. Переменная объявлена с конкретным типом-параметром, однако присваиваемое значение не соответствует ожидаемому типу. Найдите строку с ошибкой и исправьте её, чтобы код стал корректным с точки зрения системы типов TypeScript.

Найдите ошибку и исправьте
interface Box<T> {
  value: T;
}
 
let numberBox: Box<number> = {
  value: "10"
};
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Обертка ответа

id: 40713_gi_05_build

Из предложенных строк соберите корректную 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Generic vs Static

id: 40713_gi_06_sort

Перед вами список объявлений интерфейсов на 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;
}
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40713_compiler

Погрузитесь в мир универсальных интерфейсов! Здесь мы создаем гибкий шаблон `ApiResponse<T>`, который может описывать ответ сервера с любыми данными внутри. Попробуйте изменить тип данных в интерфейсе, добавьте новые поля, такие как `errorCode` или `pagination`, и посмотрите, как строго TypeScript следит за соответствием типов. Экспериментируйте: создайте свой собственный интерфейс для корзины покупок или игрового персонажа, используя дженерики для описания различных характеристик.

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру