A simple ActionCreator and Reducer library that provides type-safe for TypeScript.
Used for React (useReducer
), Redux, etc.
npm install action-reducer
import ActionReducer from 'action-reducer'
// OR
// const ActionReducer = require('action-reducer').default
const initState = { flag: false }
const { createAction, reducer } = ActionReducer(initState)
export const toggleFlag = createAction(
'TOGGLE_FLAG', // action type (Optional arg)
(state) => // Reducer for this action
({ ...state, flag: !state.flag })
)
export const setFlag = createAction(
'SET_FLAG',
(state, arg1, /* arg2, arg3... */) =>
({ ...state, flag: arg1 })
)
// reducer can be used as Redux Reducer!!
export default reducer
setFlag.type // 'SET_FLAG'
setFlag(true) // { type: 'SET_FLAG', payload: [true] }
reducer(initState, setFlag(true)) // { flag: true }
const { createAction, reducer } = ActionReducer(initState)
// OR
// const { createAction, reducer } = ActionReducer<State>()
// just specify the type in the argument
export const setFlag = createAction(
'SET_FLAG',
(state, arg1: boolean) =>
({ ...state, flag: arg1 })
)
You can use it the same way as before.
// components/some-component.js
import { setFlag, toggleFlag } from '../modules/flag'
dispatch(setFlag(true))
// modules/index.js
import { combineReducers } from 'redux'
import flag from './flag'
export default combineReducers({
flag: flag,
})
const { createAction } = ActionReducer(initState, 'PREFIX/')
// with prefix
const fooAction = createAction('foo', fooFn)
fooAction.type // PREFIX/foo
fooAction() // { type: 'PREFIX/foo', payload: [] }
// The prefix is ignored when specifying an object
const barAction = createAction({ type: 'bar' }, barFn)
barAction.type // bar
barAction() // { type: 'bar', payload: [] }
- initState? (
State
): Redux initial State. (Optional arg for ReactuseReducer
) - prefix? (
string
): Prefix for action type. (Optional arg) - return (
{ createAction: CreateAction, reducer: Reducer }
): CreateAction and Reducer.
- type? (
string | symbol | { type: string }
): Action type. (Optional arg) - mutation (
(state: State, ...args: Payload) => State
): Mutation for this action. - return (
AcitonCreator
): Action creator function.
- ...args (
Payload
): Action args. - return (
{ type: string | symbol, payload: Payload }
): Action object.
- state (
State
): Current state. - action (
any
): Action object. - return (
State
): New state.