Immutable and type-checked state and actions for Redux
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
.eslintrc
.gitignore
.travis.yml
CHANGELOG.md
LICENSE
README.md
index.js
karma.conf.js
package.json

README.md

build status

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) -> Function
  • createCheckedReducer(reducer: Reducer, State: Type) -> Reducer
  • createActionType(actions: {[key: string]: Type}) -> Type

License

The MIT License (MIT)