clean-architecture
Version:
Utilities for implementing clean architecture using Redux
20 lines (19 loc) • 1.05 kB
TypeScript
import type { NonPostableEvt } from "evt";
type StatesToHook<States extends Record<string, Record<string, any>>> = <UsecaseName extends keyof States, SelectorName extends keyof States[UsecaseName] extends `get${infer N}` ? Uncapitalize<N> : never>(usecaseName: UsecaseName, selectorName: SelectorName) => States[UsecaseName][`get${Capitalize<SelectorName>}`] extends (...args: any[]) => infer ReturnType ? ReturnType : never;
type CoreLike = {
states: Record<string, Record<string, any>>;
evtStateUpdated: NonPostableEvt<void>;
};
type ReactApi<Core extends CoreLike, ParamsOfBootstrapCore> = {
ofTypeCore: Core;
getCoreSync: () => Core;
getCore: () => Promise<Core>;
useCoreState: StatesToHook<Core["states"]>;
triggerCoreBootstrap: (params: ParamsOfBootstrapCore) => void;
};
export declare function createReactApi<Core extends CoreLike, ParamsOfBootstrapCore>(params: {
bootstrapCore: (params: ParamsOfBootstrapCore) => Promise<{
core: Core;
}>;
}): ReactApi<Core, ParamsOfBootstrapCore>;
export {};