UNPKG

clean-redux

Version:

Utilities for implementing clean architecture using Redux

29 lines (28 loc) 3.04 kB
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 {};