Estoy usando Redux con Immer. Este es mi código hasta ahora:
clearMachineState(state, { payload }: ClearMachineStatePayload) { const childrenIds = payload.children.map((child) => child.id); const newMachines = typedMachineState.machine_state.machines.flatMap((machine) => { const tmpMachines: MachineMapping[] = []; childrenIds.forEach((id) => { console.log(id, machine.machine_id); if (id !== machine.machine_id) { const foundMachine = tmpMachines.find( (tmpMachine) => tmpMachine.machine_id === machine.machine_id, ); if (!foundMachine) { tmpMachines.push(machine); } } }); console.log({ tmpMachines }); return tmpMachines; }); console.log({ newMachines }); state.machine_state.machines = newMachines; } Quiero eliminar de state.machine_state.machines , estas máquinas, que están presentes en payload.children . El problema es que, cuando uso el código anterior, en TS, todo parece estar bien, pero cuando registro {tmpMachines} , veo esto:
Object { tmpMachines: (1) [… tmpMachines: Array [ Proxy ] 0: Proxy { <target>: null, <handler>: null } length: 1 <prototype>: Array [] <prototype>: Object { … }Pero si uso la matriz simulada, así:
const newMachines = typedMachineState.machine_state.machines.flatMap((machine) => {...Obtengo el objeto real.
Pero de cualquier manera, state.machine_state.machines = newMachines; la asignación no sucede. Lo hace, si trato de hacer un state.machine_state.machines = []; , pero no para mis arreglos creados.
También me gustaría mapear en el estado, no en una fuente externa.
¿Qué me estoy perdiendo?
Esto no fue un problema del immer. Este era un problema de lógica. Aquí está el código de trabajo:
clearMachineState(state, { payload }: ClearMachineStatePayload) { const childrenIds = payload.children.map((child) => child.id); const newMachines: MachineMapping[] = []; typedMachineState.machine_state.machines.forEach((machine) => { if (!childrenIds.includes(machine.machine_id)) { newMachines.push(machine); } }); state.machine_state.machines = newMachines; },