action-reducer
Version:
Type-safe ActionCreator and Reducer library
122 lines (86 loc) • 2.81 kB
Markdown
and Reducer library that provides type-safe for TypeScript.
Used for React (`useReducer`), Redux, etc.
## Installation
```
npm install action-reducer
```
## Usage
### Basic
```js
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 }
```
```ts
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.
```js
// components/some-component.js
import { setFlag, toggleFlag } from '../modules/flag'
dispatch(setFlag(true))
```
```js
// modules/index.js
import { combineReducers } from 'redux'
import flag from './flag'
export default combineReducers({
flag: flag,
})
```
### with Prefix
```js
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 React `useReducer`)
- 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.
A simple ActionCreator