Generic функции

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

Тренажер по TypeScript

Generic функции (обобщённые функции) — это мощный инструмент TypeScript для создания гибкого и переиспользуемого кода. Они позволяют определять функции, которые могут работать с разными типами данных, не теряя при этом информацию об этих типах. Представьте себе шаблон для создания заданий в тренажере: один формат, но можно подставлять разное содержимое.

Синтаксис объявления generic функции включает угловые скобки с параметром типа (часто ), который затем используется для типизации аргументов или возвращаемого значения: function identity(arg: T): T { return arg; }.

При вызове такой функции тип параметра T автоматически выводится из переданного аргумента. Это обеспечивает безопасность типов: если функция должна возвращать тот же тип, что и получила, компилятор это проверит. Уроки с практическими заданиями по generic функциям научат вас создавать универсальные утилиты для работы с массивами, объектами и другими структурами данных. Примеры и интерактивная практика сделают изучение TypeScript онлайн эффективным и наглядным.

Список тем

1. Объяви generic-параметр

id: 40711_ts_gen_01

В этом задании вам нужно дополнить код функции, работающей с массивом элементов одного типа. Функция должна принимать массив и возвращать его первый элемент. Для обеспечения типобезопасности и возможности работы с разными типами данных необходимо объявить 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Собери generic-функцию

id: 40711_ts_gen_02

Из предложенных строк соберите корректную TypeScript-программу, которая объявляет generic-функцию `identity`, принимающую один аргумент и возвращающую его же. Затем программа вызывает эту функцию с строковым аргументом и выводит результат в консоль. Одна из строк лишняя и в решение входить не должна.

Перетяните в правильном порядке строки из одного блока в другой
function identity<T>(arg: T): T {
    return arg;
}
let output = identity<string>("Hello");
console.log(output);
let x: number = 10;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Выбери тип из списка

id: 40711_ts_gen_03

В этом задании представлена 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]);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Исправь нарушение контракта

id: 40711_ts_gen_04

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

Найдите ошибку и исправьте
function identity<T>(value: T): T {
    return "default";
}
 
const result = identity<number>(42);
console.log(result);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Сопоставь вызов и результат

id: 40711_ts_gen_05

В левой колонке приведены вызовы 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[][]
number
Сообщения
Проверить
Показать подсказку

6. Что выведет console.log?

id: 40711_ts_gen_06

Дан код 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. Подпиши части функции

id: 40711_ts_gen_07

Разметьте объявление generic-функции merge. Укажите для каждого выделенного фрагмента, является ли он параметром типа, типом параметра функции или типом возвращаемого значения. Это задание поможет закрепить понимание структуры generic-функций в TypeScript.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
function merge< {{T~|~t1}}, {{U~|~t2}} >(obj1: {{T~|~t3}}, obj2: {{U~|~t4}}): {{T & U~|~t5}} {
return { ...obj1, ...obj2 };
}
Тип возвращаемого значения
Параметр типа
Тип параметра функции
Сообщения
Проверить
Показать подсказку

8. Чему равно возвращаемое значение?

id: 40711_ts_gen_08

В данном фрагменте кода TypeScript определена простая generic-функция, которая возвращает переданный ей аргумент без изменений. Затем эта функция вызывается с конкретным числовым значением. Определите, какое значение будет присвоено переменной result после выполнения кода. Введите это значение (число) в поле ответа.

Что должно получиться?
function identity<T>(arg: T): T {
  return arg;
}

const result = identity(100);
Сообщения
Проверить
Показать подсказку

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

id: 40711_compiler

Погрузитесь в создание универсальных функций, способных работать с несколькими типами сразу! Попробуйте изменить передаваемые значения в `makePair` или добавьте третий параметр, чтобы увидеть, как TypeScript мгновенно подстраивает типы. Экспериментируйте: напишите свою функцию, которая принимает массив любого типа и возвращает его последний элемент — проверьте, сможете ли вы сохранить строгую типизацию без использования `any`!

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