Код Junior Утилитарные типы обновлено

Generic-пагинация с метаданными

Условие

Напиши paginate<T>(items: readonly T[], page: number, perPage: number): Page<T>, где type Page<T> = { items: T[]; page: number; perPage: number; total: number; pages: number; hasNext: boolean }. Страницы с 1. Номер страницы меньше 1 считается первой, больше последней даёт пустой список (но page в ответе остаётся запрошенным после поправки снизу). pages при пустом списке 0.

Примеры

paginate([1, 2, 3, 4, 5], 1, 2) // {"items":[1,2],"page":1,"perPage":2,"total":5,"pages":3,"hasNext":true}
paginate([1, 2, 3, 4, 5], 3, 2) // {"items":[5],"page":3,"perPage":2,"total":5,"pages":3,"hasNext":false}
paginate([1, 2, 3], 0, 10) // {"items":[1,2,3],"page":1,"perPage":10,"total":3,"pages":1,"hasNext":false}

Как подойти

Подсказки: 1
  1. readonly T[] на входе: функция обещает не мутировать массив, и принимает и обычные, и readonly-массивы.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.