Immutable and type-checked state and actions for Redux (built on tcomb library)
Example
import { createStore, applyMiddleware } from 'redux' import t from 'tcomb' import { createCheckedMiddleware, createCheckedReducer, createActionType } from 'redux-tcomb' import createLogger from 'redux-logger' // types const State = t.Integer const PositiveInteger = t.refinement(t.Integer, n => n >= 0, 'PositiveInteger') const Action = createActionType({ INCREMENT: t.interface({ delta: PositiveInteger }), DECREMENT: t.interface({ delta: PositiveInteger }) }) // reducer function reducer(state = 0, action) { switch(action.type) { case 'INCREMENT' : return state + action.delta case 'DECREMENT' : return state - action.delta } return state } // configure const store = createStore( createCheckedReducer(reducer, State), applyMiddleware( createCheckedMiddleware(Action), createLogger() ) ) // ok store.dispatch({ type: 'INCREMENT', delta: 2 }) store.dispatch(Action.INCREMENT({ delta: 2 })) // bad payload store.dispatch({ type: 'INCREMENT', delta: -2 }) // throws [tcomb] Invalid value -2 supplied to Action(INCREMENT)/delta: PositiveInteger // typo store.dispatch({ type: 'INCRE', delta: 1 }) // throws [tcomb] Invalid value { "type": "INCRE", "delta": 1 } supplied to Action
API
type Reducer = (state: State, action: Action) => State;
createCheckedMiddleware(Action: Type) -> FunctioncreateCheckedReducer(reducer: Reducer, State: Type) -> ReducercreateActionType(actions: {[key: string]: Type}) -> Type
License
The MIT License (MIT)