Обобщения (Generics) могут использоваться не только в функциях и классах, но и в Type Aliases (псевдонимах типов). Это позволяет создавать универсальные описания структур данных, которые можно переиспользовать с разными типами содержимого.
Синтаксис выглядит так: type Wrapper. Здесь T выступает в роли параметра, который будет заменен на конкретный тип (например, string или number) в момент использования этого алиаса.
Это особенно полезно при описании ответов от сервера, структур данных вроде списков или деревьев, где «обертка» одинакова, а данные внутри могут меняться.
- Модуль 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 Type
В этом задании вам предстоит поработать с обобщёнными типами (generics) в TypeScript. Вам дан код, который описывает тип для ответа от сервера. Ваша задача — дополнить объявление типа, сделав его обобщённым (generic). Для этого необходимо добавить параметр типа в определение псевдонима типа (type alias) и использовать этот параметр для указания типа поля data. Обратите внимание, что в коде уже используется этот тип с конкретным типом User. Заполните пропуски в коде так, чтобы тип ApiResponse стал обобщённым и мог использоваться для различных типов данных.
// Объявите обобщённый тип ApiResponse
input1S ApiResponse input2S = {
success: boolean;
data: input3S;
};
interface User {
id: number;
name: string;
}
// Использование типа с конкретным типом User
const response: ApiResponse<User> = {
success: true,
data: { id: 1, name: "Alice" }
};2. Использование алиаса
В этом задании вам предстоит использовать generic-алиас Container для создания типизированной переменной. В коде ниже объявлен алиас Container
type Container<T> = { value: T };
let myContainer: input1S = { value: input2S };3. Параметры типа
Внимательно изучите определение сложного generic-псевдонима типа (type alias) на TypeScript. Ваша задача — найти и выделить кликом все места в этом определении, где используется переменная типа T. Отметьте как объявление параметра типа T в угловых скобках, так и все его использования внутри тела псевдонима типа. Не отмечайте другие параметры типа (например, U или K), ключевые слова языка или имена свойств.
type ApiResponse<{{T~|~t1}}> = {
data: {{T~|~t2}};
status: number;
pagination?: PaginationMeta;
};
type PaginatedResponse<{{T~|~t3}}, {{U~|~decoy1}}> = {
items: {{T~|~t4}}[];
meta: {{U~|~decoy2}};
getKey: <{{K~|~decoy3}} extends keyof {{T~|~t5}}>(key: {{K~|~decoy4}}) => {{T~|~t6}}[{{K~|~decoy5}}];
};4. Универсальный список
Из предложенных строк соберите корректное определение generic type alias List на TypeScript. Этот тип должен принимать один параметр типа Item и содержать два поля: массив items типа Item[] и метод count, возвращающий число. Игнорируйте лишние строки, которые не соответствуют этому определению или нарушают синтаксис. Правильное решение должно состоять из 4 строк: объявление типа, два поля и закрывающая фигурная скобка.
type List<Item> = { items: Item[]; count: () => number;}; items: Item; count: number;type List = {5. Пропущенный аргумент
В этом фрагменте кода TypeScript используется generic type alias Box, который требует указания типа-аргумента. Однако при объявлении переменной допущена ошибка: тип Box используется без угловых скобок и параметра типа. Найдите и исправьте строку с ошибкой, чтобы код стал корректным и компилировался без ошибок.
type Box<T> = { value: T;}; const myBox: Box = { value: 42 };6. Тип свойства
Рассмотрите приведённый фрагмент кода на TypeScript. В нём определён обобщённый тип-псевдоним Pair, который представляет собой объект с двумя свойствами: first типа A и second типа B. Затем создана переменная myPair с конкретными типами-аргументами для A и B. Определите, какой тип имеет свойство second у переменной myPair. Введите название типа в поле ответа (одно слово).
type Pair<A, B> = { first: A, second: B };
const myPair: Pair<string, number> = { first: "hello", second: 42 };7. Сопоставление реализаций
В левой колонке приведены определения общих псевдонимов типов (generic type aliases) на TypeScript. В правой колонке — примеры объявления переменных с использованием этих типов. Сопоставьте каждое определение с соответствующим примером использования. Обратите внимание, что в правой колонке примеры перемешаны.
type Box<T> = { value: T };type Container<K, V> = { key: K; value: V };type Wrapper<T> = T | null;type Pair<T, U> = [T, U];type Callback<T> = (arg: T) => void;type Result<T, E> = { success: true; data: T } | { success: false; error: E };type Maybe<T> = T | undefined;type MapOf<T> = { [key: string]: T };const result: Result<string, Error> = { success: true, data: "ok" };const wrapped: Wrapper<number> = 42;const container: Container<number, string> = { key: 1, value: "one" };const maybe: Maybe<number> = undefined;const box: Box<string> = { value: "hello" };const callback: Callback<string> = (s) => console.log(s);const map: MapOf<boolean> = { enabled: true, visible: false };const pair: Pair<string, number> = ["age", 25];