typed-vuex
Version:
A typed store accessor for Vuex.
112 lines (100 loc) • 6.67 kB
TypeScript
import { GetterTree, CommitOptions, MutationTree, Dispatch, DispatchOptions, Store, ActionTree } from 'vuex';
declare type Not<T, M> = T extends M ? never : T;
declare type StoreParameter<T extends () => any> = Parameters<T>[1] extends undefined ? never : Parameters<T>[1] extends NonNullable<Parameters<T>[1]> ? Parameters<T>[1] : Parameters<T>[1] | undefined;
declare type MergedFunctionProcessor<T extends () => any, O> = Parameters<T>[1] extends undefined ? (options?: O) => ReturnType<T> : Parameters<T>[1] extends NonNullable<Parameters<T>[1]> ? (payload: Parameters<T>[1], options?: O) => ReturnType<T> : (payload?: Parameters<T>[1], options?: O) => ReturnType<T>;
declare type StateObject = Not<Record<string, any>, Function>;
declare type StateFunction = Not<() => unknown | any, Record<string, any>>;
declare type State = StateObject | StateFunction;
declare type StateType<T extends State> = T extends () => any ? ReturnType<T> : T;
declare type GettersTransformer<T extends Record<string, any>> = Readonly<{
[P in keyof T]: ReturnType<T[P]>;
}>;
declare const getterTree: <S, T extends GetterTree<StateType<S>, any>>(_state: S, tree: T) => T;
declare type MutationsTransformer<T extends Record<string, any>> = {
[P in keyof T]: MergedFunctionProcessor<T[P], CommitOptions>;
};
interface Commit<T extends Record<string, () => any>> {
<P extends keyof T>(mutation: P, payload: StoreParameter<T[P]>, options?: CommitOptions): ReturnType<T[P]>;
<P extends keyof T>(mutation: StoreParameter<T[P]> extends never ? P : never, options?: CommitOptions): ReturnType<T[P]>;
}
declare const mutationTree: <S, T extends MutationTree<StateType<S>>>(_state: S, tree: T) => T;
declare type NuxtModules = Record<string, Partial<NuxtStore>>;
declare type ModuleTransformer<T, O = string> = T extends NuxtModules ? {
[P in keyof T]: MergedStoreType<T[P] & BlankStore, O>;
} : {};
declare type RootStateHelper<T extends Required<NuxtStore>> = StateType<T['state']> & ModuleTransformer<T['modules'], 'state'>;
declare type RootGettersHelper<T extends Required<NuxtStore>> = GettersTransformer<T['getters']> & ModuleTransformer<T['modules'], 'getters'>;
declare type ActionContext<T extends Required<NuxtStore>> = {
state: StateType<T['state']>;
getters: {
[P in keyof T['getters']]: ReturnType<T['getters'][P]>;
};
commit: Commit<T['mutations']>;
dispatch: Dispatch;
rootState: any;
rootGetters: any;
};
declare type ActionTransformer<T extends Record<string, any>> = {
[P in keyof T]: MergedFunctionProcessor<T[P], DispatchOptions>;
};
interface ActionHandler<T extends NuxtStore> {
(this: Store<StateType<T['state']>>, injectee: ActionContext<T>, payload?: any): any;
}
interface ModifiedActionTree<T extends NuxtStore> {
[key: string]: ActionHandler<T>;
}
interface NormalisedActionHandler<T extends ActionHandler<any>> {
(this: Store<any>, ...args: Parameters<T>): ReturnType<T>;
}
declare type NormalisedActionTree<T extends ModifiedActionTree<any>> = {
[P in keyof T]: NormalisedActionHandler<T[P]>;
};
declare const actionTree: <S extends Record<string, any>, G extends GetterTree<StateType<S>, any>, M extends MutationTree<StateType<S>>, T extends ModifiedActionTree<Required<NuxtStoreInput<S, G, M, {}, {}>>>>(_store: NuxtStoreInput<S, G, M, {}, {}>, tree: T) => NormalisedActionTree<T>;
interface BlankStore {
state: {};
getters: {};
mutations: {};
actions: {};
modules: {};
namespaced: boolean;
strict: boolean;
}
interface NuxtStore {
state: State;
getters: Record<string, any>;
mutations: Record<string, any>;
actions: Record<string, any>;
modules: NuxtModules;
namespaced: boolean;
strict: boolean;
}
interface NuxtStoreInput<T extends State, G, M, A, S extends {
[key: string]: Partial<NuxtStore>;
}> {
strict?: boolean;
namespaced?: boolean;
state: T;
getters?: G;
mutations?: M;
actions?: A;
modules?: S;
}
declare type MergedStoreType<T extends NuxtStore, K = string> = ('state' extends K ? StateType<T['state']> : {}) & ('getters' extends K ? GettersTransformer<T['getters']> : {}) & ('mutations' extends K ? MutationsTransformer<T['mutations']> : {}) & ('actions' extends K ? ActionTransformer<T['actions']> : {}) & ('modules' extends K ? ModuleTransformer<T['modules']> : {});
declare const getStoreType: <T extends Record<string, any>, G, M, A, S extends NuxtModules>(store: NuxtStoreInput<T, G, M, A, S>) => {
actionContext: ActionContext<NuxtStoreInput<T, G, M, A, S> & BlankStore>;
rootState: RootStateHelper<NuxtStoreInput<T, G, M, A, S> & BlankStore>;
rootGetters: RootGettersHelper<NuxtStoreInput<T, G, M, A, S> & BlankStore>;
storeInstance: ActionContext<NuxtStoreInput<T, G, M, A, S> & BlankStore> & Store<StateType<T>>;
};
declare type ComputedState<T extends Record<string, any>> = {
[K in keyof T]: T[K] extends Function ? T[K] : () => T[K];
};
interface Mapper<T extends Record<string, any>> {
<M extends keyof T, P extends keyof T[M] = string>(prop: M, properties: P[]): ComputedState<Pick<T[M], P>>;
<M extends keyof T, _P extends keyof T[M] = string>(prop: M | M[]): ComputedState<Pick<T, M>>;
}
declare const getAccessorType: <T extends Record<string, any>, G extends GetterTree<StateType<T>, any>, M extends MutationTree<StateType<T>>, A extends ActionTree<StateType<T>, any>, S extends NuxtModules>(store: Partial<NuxtStoreInput<T, G, M, A, S>>) => MergedStoreType<Partial<NuxtStoreInput<T, G, M, A, S>> & BlankStore, string>;
declare const useAccessor: <T extends Record<string, any>, G extends GetterTree<StateType<T>, any>, M extends MutationTree<StateType<T>>, A extends ActionTree<StateType<T>, any>, S extends NuxtModules>(store: Store<any>, input: Partial<NuxtStoreInput<T, G, M, A, S>>, namespace?: string | undefined) => MergedStoreType<Partial<NuxtStoreInput<T, G, M, A, S>> & BlankStore, string>;
declare const getAccessorFromStore: (pattern: any) => (store: Store<any>) => MergedStoreType<Partial<NuxtStoreInput<Record<string, any>, GetterTree<Record<string, any>, any>, MutationTree<Record<string, any>>, ActionTree<Record<string, any>, any>, NuxtModules>> & BlankStore, string>;
declare const createMapper: <T extends Record<string, any>>(accessor: T) => Mapper<T>;
export { ActionContext, ActionTransformer, BlankStore, Commit, ComputedState, GettersTransformer, Mapper, MergedStoreType, MutationsTransformer, NormalisedActionHandler, NuxtStore, NuxtStoreInput, RootGettersHelper, RootStateHelper, actionTree, createMapper, getAccessorFromStore, getAccessorType, getStoreType, getterTree, mutationTree, useAccessor };