Обобщения, или Generics, — это мощный инструмент в TypeScript, позволяющий создавать компоненты, работающие с различными типами данных, сохраняя при этом строгую типизацию. Вместо использования any, который отключает проверку типов, мы используем переменную типа (обычно обозначается как T).
Дженерики позволяют функции, классу или интерфейсу «захватывать» тип, переданный пользователем, и использовать его в дальнейшем. Это ключевой элемент для создания переиспользуемого кода и библиотек. На этом уроке вы узнаете, как объявлять обобщенные функции и как 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 — ограничения
- Модуль 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 выделите следующие элементы: объявление параметра типа (в угловых скобках), использование этого параметра типа в аннотациях аргументов и возвращаемого значения. Доступные типы для разметки: 'Объявление параметра типа' и 'Использование параметра типа'. Это задание поможет закрепить понимание синтаксиса объявления и использования generic-параметров.
function {{identity~|~t1}}<{{T~|~t2}}>({{value~|~t3}}: {{T~|~t4}}): {{T~|~t5}} {
return {{value~|~t6}};
}2. Объявление Generic функции
В этом задании вам предстоит объявить generic-функцию. В коде функции `identity` пропущены угловые скобки с параметром типа и тип аргумента. Заполните пропуски, чтобы функция стала обобщенной и могла работать с любым типом данных. Используйте параметр типа `T`.
// Объявите generic функцию с параметром типа T
function identity input1S (arg: input2S): input2S {
return arg;
}3. Generic vs Any
Перед вами список функций, написанных на TypeScript. Разнесите их по двум категориям: 'Использует Generics (безопасно)' и 'Использует any (небезопасно)'. Обратите внимание на объявление типов в параметрах и возвращаемом значении. Каждая функция должна оказаться в одной из двух категорий.
function identity<T>(arg: T): T { return arg; }function getFirstElement(arr: any[]): any { return arr[0]; }function mergeObjects<T, U>(obj1: T, obj2: U): T & U { return { ...obj1, ...obj2 }; }function logValue(value: any): void { console.log(value); }function toArray<T>(...args: T[]): T[] { return args; }function parseData(data: any): any { return JSON.parse(data); }4. Несоответствие типов
В этом фрагменте кода TypeScript используется generic-функция, но при её вызове допущена ошибка: тип, указанный в угловых скобках, не соответствует типу передаваемого аргумента. Найдите строку с ошибкой и исправьте её, чтобы код стал корректным. Обратите внимание, что исправление должно быть выполнено только в одной строке — либо измените тип в угловых скобках, либо измените передаваемый аргумент.
function identity<T>(value: T): T { return value;} let result = identity<string>(42);console.log(result);5. Создание функции swap
Из предложенных строк соберите корректную TypeScript-функцию `swap`, которая меняет местами два значения произвольного типа `T`. Функция должна использовать дженерики, принимать два параметра типа `T` и возвращать кортеж (массив) из двух элементов типа `T` в обратном порядке. Игнорируйте лишние строки, которые не соответствуют этой задаче или нарушают синтаксис.
function swap<T>(a: T, b: T): [T, T] { return [b, a];}function swap(a: any, b: any): any { return [a, b]; let temp = a; a = b; b = temp;console.log(swap(1, 2));