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