interface UniversalAction { type: "UNIVERSAL"; map: (previous: TState) => TState; } function universalAction(map: (previous: TState) => TState): UniversalAction { return { type: "UNIVERSAL", map }; } // all other reducers are now redundant function universalReducer(previous: TState, action: UniversalAction) { switch (action.type) { case "UNIVERSAL": return action.map(previous); default: throw "Obsolete action type detected"; } }