Код Middle Дженерики обновлено

partition с type guard

Условие

Напиши partition с двумя перегрузками:

  • partition<T, S extends T>(items: readonly T[], pred: (x: T) => x is S): [S[], Exclude<T, S>[]]: если передан type guard, обе части сужаются;
  • partition<T>(items: readonly T[], pred: (x: T) => boolean): [T[], T[]].

Функция splitPayments в заготовке делит платежи на успешные и неуспешные через guard isPaid и возвращает суммы обеих частей.

Примеры

splitPayments([{"status":"paid","amount":100,"paidAt":"x"}, {"status":"failed","amount":50,"reason":"no funds"}, {"status":"paid","amount":30,"paidAt":"y"}]) // {"paid":130,"reasons":["no funds"]}
splitPayments([]) // {"paid":0,"reasons":[]}
splitPayments([{"status":"failed","amount":1,"reason":"a"}, {"status":"failed","amount":2,"reason":"b"}]) // {"paid":0,"reasons":["a","b"]}

Как подойти

Подсказки: 2
  1. Реализация одна, перегрузки только описывают типы.
  2. Порядок перегрузок важен: сначала более узкая с type guard.

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

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

Термины по теме