Используйте два параметра типа, T для элемента и U для накопителя. Any выключает проверку операций, тогда как unknown требует сначала сузить неизвестный тип.
Как типизировать собственный reduce с initialValue
Используйте два параметра типа, T для элемента и U для накопителя. Any выключает проверку операций, тогда как unknown требует сначала сузить неизвестный тип.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите TypeScript-аналог reduce для плотного массива с обязательным начальным значением. Тип элемента и накопителя могут различаться. Чем здесь опасен any?
Ответ
Используйте два параметра типа, T для элемента и U для накопителя. Any выключает проверку операций, тогда как unknown требует сначала сузить неизвестный тип.
Реализация:
function reduce<T, U>(items: readonly T[], fn: (acc: U, item: T, index: number) => U, initial: U): U {
let acc = initial;
for (let i = 0; i < items.length; i++) acc = fn(acc, items[i], i);
return acc;
}
Контракт здесь не копирует все особенности нативного reduce: нет варианта без initialValue и поддержки разреженных массивов.