Проверяет умение типизировать обобщённые функции высшего порядка в TypeScript, что важно для написания переиспользуемого и безопасного кода.
Функция map — это классический пример функции высшего порядка: она принимает массив и функцию-преобразователь, а возвращает новый массив с преобразованными элементами. В TypeScript важно описать связь между типами входа и выхода так, чтобы компилятор мог вывести их автоматически и не терять информацию о типах.
Используем два параметра типа: T — тип элементов исходного массива, U — тип элементов результата. Колбэк принимает элемент, индекс и сам массив, а возвращает U.
function myMap<T, U>(
arr: T[],
callback: (item: T, index: number, array: T[]) => U
): U[] {
const result: U[] = [];
for (let i = 0; i < arr.length; i++) {
result.push(callback(arr[i], i, arr));
}
return result;
}
const nums = [1, 2, 3];
const strs = myMap(nums, n => n.toString()); // string[]
T из первого аргумента (number), а U — из возвращаемого значения колбэка (string).myMap<number, string>(...) нужно редко — обычно хватает вывода.Для кортежей можно использовать mapped types, чтобы сохранить длину массива. Это уже продвинутый приём, но полезно знать:
type MapTuple<T extends readonly unknown[], U> = {
[K in keyof T]: U;
};
function mapTuple<T extends readonly unknown[], U>(
arr: T,
cb: (item: T[number]) => U
): MapTuple<T, U> {
return arr.map(cb) as MapTuple<T, U>;
}
Итог: типизация собственного map строится на дженериках <T, U> и корректной сигнатуре колбэка. Такой подход стоит применять везде, где вы пишете утилиты для работы с массивами или другими коллекциями — это даёт автовывод типов и защищает от ошибок на этапе компиляции.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию