import { ComponentClass } from 'react'; export type Setter = (value?: T | ((value: T) => T | undefined | null)) => void; export type HookReturn = [T, Setter]; export type Store = Record; export type ReducerFn = (a: Store, c: string, index?: number, arr?: string[]) => any; export type Params = { store: S; prevStore: S; }; export type ListenersObj = { [key: string]: Set>; }; export type Subscription = { _subscribe(path: string, listener?: Listener): void; _unsubscribe(path: string, listener?: Listener): void; _notify(path: string, params: Params): void; }; export type ExtraFn = (res: Result, subscription: Subscription) => Extra; export type Extra = { [key: string]: any; }; export type ValueOf = T[keyof T]; export type Validator = ProxyHandler>> & Extra; export type Hook = (initial?: S, onAfterUpdate?: Listener) => HookReturn; export type HookDry = (initial?: S) => HookReturn; export type Hoc = { store: HookReturn; }; export type Args = [ param: S | ComponentClass>, callback: Listener | undefined ]; export type ArgsHoc = [ component: ComponentClass>, param: S, callback: Listener | undefined ]; export type HocFunc = ComponentClass> = (component: R, initial?: S, onAfterUpdate?: Listener) => R & { store: useStoreType; }; export type Listener = (params: Params) => void; export type getStoreType = { [key in keyof S]-?: NonNullable extends Store ? getStoreType & HookDry : HookDry; }; export type setStoreType = { [key in keyof S]-?: NonNullable extends Store ? setStoreType & Setter : Setter; }; export type useStoreType = { [key in keyof S]-?: NonNullable extends Store ? useStoreType & Hook : Hook; }; export type withStoreType = { [key in keyof S]-?: NonNullable extends Store ? withStoreType & HocFunc : HocFunc; }; type Complete = { [P in keyof Required]: Pick extends Required> ? T[P] : (T[P] | undefined); }; export type Result = { getStore: HookDry> & getStoreType>; useStore: Hook> & useStoreType>; withStore: HocFunc> & withStoreType>; setStore: Setter> & setStoreType>; } & Extra; export {};