Simple and 100% type safe actions and reducers with no boilerplate code 🎉
{ type: 'THE_ANSWER', payload: 42 }
RootAction
typeimport { defineAction, createReducer } from 'yartsul';
import { createStore } from 'redux';
/* define actions */
const Increment = defineAction('Counter/Increment');
const Decrement = defineAction<void>('Counter/Decrement'); // same as above but more explicit
const Add = defineAction<number>('Counter/Add');
/* create reducer */
type State = {
readonly counter: number;
readonly otherStuff: string;
};
const initialState: State = {
counter: 0,
otherStuff: ''
};
const reducer = createReducer<State>(
initialState,
// you can just return the next state
Increment.handler(state => ({ ...state, counter: state.counter + 1 })),
// or mutate the provided state draft to create next state (see: immer.js)
Add.handler((state, amount) => {
state.counter = state.counter + amount;
})
);
/* creating store and middlewares are not affected by this lib */
const store = createStore(reducer);
/* create and dispatch some actions! */
store.dispatch(Increment());
store.dispatch(Increment(1)); // Type error!
store.dispatch(Add(2));
store.dispatch(Add('2')); // Type error!
store.dispatch(Add()); // Type error!
handlers created by ActionDefinition.handler
function
Creates VoidActionDefinition
object for given action type
globally unique action type
Creates PayloadActionDefinition
object for given action type and payload type.
globally unique action type
Generated using TypeDoc
Creates
redux
anduseReducer
compatible reducer function from given action handlers which are run thorught immerproduce
function to create next state.