Код Middle Объединения и сужение спрашивают часто обновлено

Reducer корзины на discriminated union

Условие

Опиши тип CartAction как discriminated union по полю type:

  • { type: 'add'; sku: string; price: number; qty: number }: добавить товар (если уже есть, увеличить количество, цену не менять);
  • { type: 'remove'; sku: string }: убрать позицию;
  • { type: 'setQty'; sku: string; qty: number }: задать количество, qty <= 0 убирает позицию;
  • { type: 'clear' }.

Напиши cartReducer(state, action) с исчерпывающим switch и assertNever в default. Состояние: { items: { sku, price, qty }[]; total: number }, total пересчитывается после каждого действия. runCart(actions) применяет действия к пустой корзине.

Примеры

runCart([{"type":"add","sku":"tea","price":300,"qty":2}, {"type":"add","sku":"cup","price":500,"qty":1}]) // {"items":[{"sku":"tea","price":300,"qty":2},{"sku":"cup","price":500,"qty":1}],"total":1100}
runCart([{"type":"add","sku":"tea","price":300,"qty":1}, {"type":"add","sku":"tea","price":999,"qty":2}]) // {"items":[{"sku":"tea","price":300,"qty":3}],"total":900}
runCart([{"type":"add","sku":"a","price":10,"qty":1}, {"type":"setQty","sku":"a","qty":5}]) // {"items":[{"sku":"a","price":10,"qty":5}],"total":50}

Как подойти

Подсказки: 2
  1. В каждом case TS сужает action до одного варианта, и его поля доступны без проверок.
  2. assertNever(action) в default перестанет компилироваться, если добавить вариант и забыть его обработать.

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

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