An action is a pure function: (state, ...args) => newState.
(state, ...args) => newState
The state argument is DeepReadonly<S> so the compiler stops you from mutating in place. Return a new object — spread, structured-clone, Immer, whatever you prefer.
DeepReadonly<S>
const moveBy: Action<{ x: number; y: number }, [dx: number, dy: number]> = (s, dx, dy) => ({ x: s.x + dx, y: s.y + dy }); Copy
const moveBy: Action<{ x: number; y: number }, [dx: number, dy: number]> = (s, dx, dy) => ({ x: s.x + dx, y: s.y + dy });
An action is a pure function:
(state, ...args) => newState.The state argument is
DeepReadonly<S>so the compiler stops you from mutating in place. Return a new object — spread, structured-clone, Immer, whatever you prefer.