neant
Version:
The simplest React state management library - direct mutations, direct destructuring, automatic fine-grained reactivity
37 lines (33 loc) • 1.32 kB
TypeScript
import * as immer from 'immer';
import { Draft } from 'immer';
type StateCreator<T> = (setState: (updater: ProduceParam<T>) => void, getState: () => T) => T;
type ExtractState<S> = S extends {
getState: () => infer T;
} ? T : never;
type UseBoundStore<S> = {
(): ExtractState<S>;
<U>(selector: (state: ExtractState<S>) => U): U;
} & S;
interface StoreApi<T> {
setState: (updater: ProduceParam<T>) => void;
getState: () => T;
subscribe: (listener: (state: T, prevState: T) => void) => () => void;
}
type ProduceParam<T> = ((draft: Draft<T>) => void);
type WithDirectStateAccess<S> = S extends {
getState: () => infer T;
} ? S & {
use: {
[K in keyof T]: () => T[K];
};
} : never;
declare function createEnhancedStore<T>(createState: StateCreator<T>): WithDirectStateAccess<UseBoundStore<StoreApi<T>>>;
type StoreType<T> = ReturnType<typeof createEnhancedStore<T>>;
type StoreState<T> = ReturnType<StoreType<T>['getState']>;
declare function createStore<T extends object>(createState: StateCreator<T>): {
useAppStore: () => T;
subscribe: (listener: (state: T, prevState: T) => void) => () => void;
getState: () => T;
setState: (updater: (draft: immer.Draft<T>) => void) => void;
};
export { type StoreState, type StoreType, createEnhancedStore, createStore };