Нужны два generic-параметра: TSource для входного элемента и TResult для результата. Callback связывает их и позволяет вывести итоговый тип массива.
Корректная типизация функции map в TypeScript
Нужны два 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[].