clean-architecture
Version:
Utilities for implementing clean architecture using Redux
20 lines (19 loc) • 1.25 kB
TypeScript
import type { ConfigureStoreOptions, EnhancedStore, MiddlewareArray, ThunkMiddleware, AnyAction, ReducersMapObject } from "@reduxjs/toolkit";
import { type UsecasesToReducer, type UsecaseLike as UsecaseLike_reducer } from "./usecasesToReducer";
import { type UsecaseToEvent, type UsecaseLike as UsecaseLike_evtMiddleware } from "./middlewareEvtAction";
import type { NonPostableEvt } from "evt";
export type UsecaseLike = UsecaseLike_reducer & UsecaseLike_evtMiddleware;
export type GenericStore<Context extends Record<string, unknown>, Usecase extends UsecaseLike> = {
reducer: UsecasesToReducer<Usecase>;
middleware: MiddlewareArray<[
ThunkMiddleware<UsecasesToReducer<Usecase> extends ReducersMapObject<infer S, any> ? S : never, AnyAction, Context & {
evtAction: NonPostableEvt<UsecaseToEvent<Usecase>>;
}>
]>;
} extends ConfigureStoreOptions<infer S, infer A, infer M> ? Pick<EnhancedStore<S, A, M>, "getState" | "dispatch"> & {
evtAction: NonPostableEvt<UsecaseToEvent<Usecase>>;
} : never;
export declare function createStore<Context extends Record<string, unknown>, Usecase extends UsecaseLike>(params: {
context: Context;
usecasesArr: readonly Usecase[];
}): GenericStore<Context, Usecase>;