function createActionHook<
S extends Slice,
A extends S["actions"],
R extends {
[K in keyof A]: (
...args: Parameters<A[K]>
) => ReturnType<Dispatch<ReturnType<A[K]>>>;
}
>(slice: S) {
return () => {
const dispatch = useDispatch();
return useMemo(
() => bindActionCreators(slice.actions, dispatch),
[dispatch]
) as unknown as R;
};
}
function createSelectorHooks<
S extends Slice,
I extends ReturnType<S["getInitialState"]>,
R extends { [key in Slice["reducerPath"]]: I },
H extends { [K in keyof I as `use${Capitalize<string & K>}`]: () => I[K] }
>(slice: S) {
return Object.fromEntries(
Object.keys(slice.getInitialState()).map((key) => [
`use${key[0].toUpperCase()}${key.slice(1)}`,
() => useSelector((rootState: R) => rootState[slice.reducerPath][key]),
])
) as H;
}
function createActionHook<
S extends Slice,
A extends S["actions"],
R extends {
[K in keyof A]: (
...args: Parameters<A[K]>
) => ReturnType<Dispatch<ReturnType<A[K]>>>;
}
>(slice: S) {
return () => {
const dispatch = useDispatch();
return useMemo(
() => bindActionCreators(slice.actions, dispatch),
[dispatch]
) as unknown as R;
};
}
function createSelectorHooks<
S extends Slice,
I extends ReturnType<S["getInitialState"]>,
R extends { [key in Slice["reducerPath"]]: I },
H extends { [K in keyof I as `use${Capitalize<string & K>}`]: () => I[K] }
>(slice: S) {
return Object.fromEntries(
Object.keys(slice.getInitialState()).map((key) => [
`use${key[0].toUpperCase()}${key.slice(1)}`,
() => useSelector((rootState: R) => rootState[slice.reducerPath][key]),
])
) as H;
}