import { Dispatch } from './types/store' import { ActionCreator, ActionCreatorsMapObject, Action } from './types/actions' import { kindOf } from './utils/kindOf' function bindActionCreator( actionCreator: ActionCreator, dispatch: Dispatch ) { return function (this: any, ...args: any[]) { return dispatch(actionCreator.apply(this, args)) } } /** * Turns an object whose values are action creators, into an object with the * same keys, but with every function wrapped into a `dispatch` call so they * may be invoked directly. This is just a convenience method, as you can call * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. * * For convenience, you can also pass an action creator as the first argument, * and get a dispatch wrapped function in return. * * @param actionCreators An object whose values are action * creator functions. One handy way to obtain it is to use `import * as` * syntax. You may also pass a single function. * * @param dispatch The `dispatch` function available on your Redux * store. * * @returns The object mimicking the original object, but with * every action creator wrapped into the `dispatch` call. If you passed a * function as `actionCreators`, the return value will also be a single * function. */ export default function bindActionCreators>( actionCreator: C, dispatch: Dispatch ): C export default function bindActionCreators< A extends ActionCreator, B extends ActionCreator >(actionCreator: A, dispatch: Dispatch): B export default function bindActionCreators< A, M extends ActionCreatorsMapObject >(actionCreators: M, dispatch: Dispatch): M export default function bindActionCreators< M extends ActionCreatorsMapObject, N extends ActionCreatorsMapObject >(actionCreators: M, dispatch: Dispatch): N export default function bindActionCreators( actionCreators: ActionCreator | ActionCreatorsMapObject, dispatch: Dispatch ) { if (typeof actionCreators === 'function') { return bindActionCreator(actionCreators, dispatch) } if (typeof actionCreators !== 'object' || actionCreators === null) { throw new Error( `bindActionCreators expected an object or a function, but instead received: '${kindOf( actionCreators )}'. ` + `Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?` ) } const boundActionCreators: ActionCreatorsMapObject = {} for (const key in actionCreators) { const actionCreator = actionCreators[key] if (typeof actionCreator === 'function') { boundActionCreators[key] = bindActionCreator(actionCreator, dispatch) } } return boundActionCreators }