Generic функции (обобщённые функции) — это мощный инструмент TypeScript для создания гибкого и переиспользуемого кода. Они позволяют определять функции, которые могут работать с разными типами данных, не теряя при этом информацию об этих типах. Представьте себе шаблон для создания заданий в тренажере: один формат, но можно подставлять разное содержимое.
Синтаксис объявления generic функции включает угловые скобки с параметром типа (часто ), который затем используется для типизации аргументов или возвращаемого значения: function identity.
При вызове такой функции тип параметра T автоматически выводится из переданного аргумента. Это обеспечивает безопасность типов: если функция должна возвращать тот же тип, что и получила, компилятор это проверит. Уроки с практическими заданиями по generic функциям научат вас создавать универсальные утилиты для работы с массивами, объектами и другими структурами данных. Примеры и интерактивная практика сделают изучение 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-параметр
В этом задании вам нужно дополнить код функции, работающей с массивом элементов одного типа. Функция должна принимать массив и возвращать его первый элемент. Для обеспечения типобезопасности и возможности работы с разными типами данных необходимо объявить generic-параметр в сигнатуре функции и указать его в нужных местах. Заполните пропуски, чтобы код стал корректным и компилировался без ошибок.
// Объявите generic-параметр с именем T и используйте его для типа массива
function getFirstElement input1S (arr: input2S): T {
return arr[0];
}
// Пример использования функции
const numbers = [1, 2, 3];
const firstNumber = getFirstElement(numbers); // firstNumber будет типа number
console.log(firstNumber);2. Собери generic-функцию
Из предложенных строк соберите корректную TypeScript-программу, которая объявляет generic-функцию `identity`, принимающую один аргумент и возвращающую его же. Затем программа вызывает эту функцию с строковым аргументом и выводит результат в консоль. Одна из строк лишняя и в решение входить не должна.
function identity<T>(arg: T): T { return arg;}let output = identity<string>("Hello");console.log(output);let x: number = 10;3. Выбери тип из списка
В этом задании представлена generic-функция identity, которая возвращает переданный аргумент без изменений. Ниже приведены четыре вызова этой функции с разными аргументами. Рядом с каждым вызовом пропущен тип результата (указан как input1, input2 и т.д.). Вам нужно для каждого пропуска выбрать правильный тип из выпадающего списка, чтобы код стал типобезопасным. Обратите внимание, что TypeScript автоматически выводит тип на основе переданного аргумента в generic-функциях.
function identity<T>(arg: T): T {
return arg;
}
let result1: input1S = identity("Hello");
let result2: input2S = identity(42);
let result3: input3S = identity(true);
let result4: input4S = identity([1, 2, 3]);4. Исправь нарушение контракта
В этом фрагменте кода TypeScript определена generic-функция, которая по задумке должна возвращать значение того же типа, что и её аргумент. Однако в теле функции допущена ошибка, из-за которой возвращается значение другого типа, нарушая контракт generic-типа. Найдите и исправьте эту ошибку, чтобы функция корректно работала с любым переданным типом.
function identity<T>(value: T): T { return "default";} const result = identity<number>(42);console.log(result);5. Сопоставь вызов и результат
В левой колонке приведены вызовы generic-функций с конкретными аргументами. В правой колонке указаны типы, которые TypeScript выведет для результатов этих вызовов. Сопоставьте каждый вызов с соответствующим типом результата. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок типов перемешан.
identity("TypeScript")toArray(42)merge({ a: 1 }, { b: "two" })getProperty({ name: "Alice", age: 30 }, "age")wrapInArray([1, 2, 3])string{ a: number } & { b: string }number[]number[][]number6. Что выведет console.log?
Дан код TypeScript с использованием generic-функции, которая обрабатывает массивы разных типов. Проанализируйте код и определите, что будет выведено в консоль после его выполнения. Обратите внимание на работу generic-функции и порядок операций.
function mergeArrays<T, U>(arr1: T[], arr2: U[]): (T | U)[] {
return [...arr1, ...arr2];
}
const numbers = [1, 2, 3];
const strings = ["a", "b"];
const merged = mergeArrays(numbers, strings);
console.log(merged);7. Подпиши части функции
Разметьте объявление generic-функции merge. Укажите для каждого выделенного фрагмента, является ли он параметром типа, типом параметра функции или типом возвращаемого значения. Это задание поможет закрепить понимание структуры generic-функций в TypeScript.
function merge< {{T~|~t1}}, {{U~|~t2}} >(obj1: {{T~|~t3}}, obj2: {{U~|~t4}}): {{T & U~|~t5}} {
return { ...obj1, ...obj2 };
}8. Чему равно возвращаемое значение?
В данном фрагменте кода TypeScript определена простая generic-функция, которая возвращает переданный ей аргумент без изменений. Затем эта функция вызывается с конкретным числовым значением. Определите, какое значение будет присвоено переменной result после выполнения кода. Введите это значение (число) в поле ответа.
function identity<T>(arg: T): T {
return arg;
}
const result = identity(100);