Код 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
- В каждом
caseTS сужаетactionдо одного варианта, и его поля доступны без проверок. assertNever(action)вdefaultперестанет компилироваться, если добавить вариант и забыть его обработать.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Assertion function для конфига
Следующий вопрос
isDefined: filter, который сужает тип