clean-architecture
Version:
Utilities for implementing clean architecture using Redux
34 lines (33 loc) • 1.19 kB
TypeScript
import type { NonPostableEvt } from "evt";
import type { Middleware, ActionCreator, ActionCreatorWithPayload, ActionCreatorWithoutPayload } from "@reduxjs/toolkit";
export type UsecaseLike = {
name: string;
} & ({
actions: Record<string, ActionCreator<any>>;
} | {
reducer: null;
actions?: undefined;
});
type RecordToUnion<O> = O[keyof O];
type CaseReducerToEvent<T extends Record<string, ActionCreator<any>>> = RecordToUnion<{
[K in keyof T]: {
actionName: K;
} & (T[K] extends ActionCreatorWithoutPayload<any> ? {} : {
payload: T[K] extends ActionCreatorWithPayload<infer U> ? U : never;
});
}>;
export type UsecaseToEvent<Usecase extends UsecaseLike> = RecordToUnion<{
[Key in Extract<Usecase, {
actions: unknown;
}>["name"]]: Usecase extends Extract<Usecase, {
name: Key;
actions: unknown;
}> ? {
usecaseName: Key;
} & CaseReducerToEvent<Usecase["actions"]> : never;
}>;
export declare function createMiddlewareEvtAction<Usecase extends UsecaseLike>(usecasesArr: readonly Usecase[]): {
evtAction: NonPostableEvt<UsecaseToEvent<Usecase>>;
middlewareEvtAction: Middleware;
};
export {};