Корректная типизация функции map в TypeScript

Нужны два generic-параметра: TSource для входного элемента и TResult для результата. Callback связывает их и позволяет вывести итоговый тип массива.

Короткий ответ

Что ответить на собеседовании

Нужны два generic-параметра: TSource для входного элемента и TResult для результата. Callback связывает их и позволяет вывести итоговый тип массива.

Подробный разбор

Ответ с пояснениями

Условие

Задача: написать типы для функции map, которая получает массив элементов одного типа и функцию‑преобразователь, а возвращает новый массив, заполненный элементами другого типа.

Требования:

  • Функция должна принимать два параметра: source — массив элементов типа TSource и converter — функцию, преобразующую элемент TSource в TResult.
  • Возвращаемое значение — массив элементов типа TResult.
  • Типы должны быть обобщёнными, чтобы компилятор корректно выводил типы при вызове функции.

Пример использования (код оставляем без изменений):

const numbers = [1, 2, 3];
const strings = map(numbers, n => n.toString()); // тип strings: string[]

Ответ

Нужны два generic-параметра: TSource для входного элемента и TResult для результата. Callback связывает их и позволяет вывести итоговый тип массива.

function map<TSource, TResult>(
  source: readonly TSource[],
  converter: (value: TSource) => TResult
): TResult[] {
  return source.map(value => converter(value));
}

Readonly разрешает передавать обычный и readonly-массив без его изменения. При callback n => n.toString() TypeScript выводит TResult как string, а результат — как string[].

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее