Как типизировать собственный reduce с initialValue

Используйте два параметра типа, T для элемента и U для накопителя. Any выключает проверку операций, тогда как unknown требует сначала сузить неизвестный тип.

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

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

Используйте два параметра типа, 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 и поддержки разреженных массивов.

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

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

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

Подробнее