import { bindActionCreators, ActionCreatorsMapObject } from 'redux'; import { useSelector, useDispatch } from 'react-redux'; import { State } from 'models/reducers'; type Selector = (s: State) => ReturnState; interface Option { shouldHooksUpdate?: (left: unknown, right: unknown) => boolean; } interface DefaultActionMap { [key: string]: ( ...params: any[] // eslint-disable-line @typescript-eslint/no-explicit-any ) => void; } export const useRedux = ( selector: Selector, actions: ActionCreatorsMapObject, options: Option = {}, ): [ReturnState, ActionCreatorsMapObject] => { const state = useSelector(selector, options.shouldHooksUpdate); const dispatch = useDispatch(); // 強制轉型 const boundActions = bindActionCreators>( actions, dispatch, ); return [state, boundActions]; };