clean-redux
Version:
Utilities for implementing clean architecture using Redux
29 lines (28 loc) • 3.04 kB
TypeScript
import "minimal-polyfills/Object.fromEntries";
import type { Param0 } from "tsafe";
import type { ThunkAction, AnyAction } from "@reduxjs/toolkit";
export declare type ThunkToAutoDispatchThunk<Thunk extends (params: any) => ThunkAction<any, any, any, any>> = (params: Param0<Thunk>) => ReturnType<Thunk> extends ThunkAction<infer R, any, any, any> ? R : never;
/** NOTE: Always returns the same ref for a given dispatch, no need to useMemo */
export declare function thunkToAutoDispatchThunk<Thunk extends (params: any) => ThunkAction<any, any, any, AnyAction>>(params: {
thunk: Thunk;
dispatch: (thunkAction: ThunkAction<ReturnType<Thunk> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never, ReturnType<Thunk> extends ThunkAction<any, infer State, any, AnyAction> ? State : never, ReturnType<Thunk> extends ThunkAction<any, any, infer ExtraThunkArg, AnyAction> ? ExtraThunkArg : never, AnyAction>) => ReturnType<Thunk> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never;
}): ThunkToAutoDispatchThunk<Thunk>;
export declare type ThunksToAutoDispatchThunks<Thunks extends Record<string, (params: any) => ThunkAction<any, any, any, AnyAction>>> = {
[Key in keyof Thunks]: ThunkToAutoDispatchThunk<Thunks[Key]>;
};
export declare function thunksToAutoDispatchThunks<Thunks extends Record<string, (params: any) => ThunkAction<any, any, any, any>>>(params: {
thunks: Thunks;
dispatch: (thunkAction: ThunkAction<ReturnType<Thunks[keyof Thunks]> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never, ReturnType<Thunks[keyof Thunks]> extends ThunkAction<any, infer State, any, AnyAction> ? State : never, ReturnType<Thunks[keyof Thunks]> extends ThunkAction<any, any, infer ExtraThunkArg, AnyAction> ? ExtraThunkArg : never, AnyAction>) => ReturnType<Thunks[keyof Thunks]> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never;
}): ThunksToAutoDispatchThunks<Thunks>;
declare const wordId = "Thunks";
export declare function usecasesToAutoDispatchThunks<Usecase extends {
name: string;
thunks: Record<string, (params: any) => ThunkAction<any, any, any, any>>;
}>(usecases: readonly Usecase[]): {
getAutoDispatchThunks: (dispatch: (thunkAction: ThunkAction<ReturnType<Usecase["thunks"][keyof Usecase["thunks"]]> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never, ReturnType<Usecase["thunks"][keyof Usecase["thunks"]]> extends ThunkAction<any, infer State, any, AnyAction> ? State : never, ReturnType<Usecase["thunks"][keyof Usecase["thunks"]]> extends ThunkAction<any, any, infer ExtraThunkArg, AnyAction> ? ExtraThunkArg : never, AnyAction>) => ReturnType<Usecase["thunks"][keyof Usecase["thunks"]]> extends ThunkAction<infer RtnType, any, any, AnyAction> ? RtnType : never) => {
[Key in `${Usecase["name"]}${typeof wordId}`]: ThunksToAutoDispatchThunks<Extract<Usecase, {
name: Key extends `${infer Name}${typeof wordId}` ? Name : never;
}>["thunks"]>;
};
};
export {};