export type ObjKeyof = T extends object ? keyof T : never; export type KeyofKeyof = ObjKeyof | { [K in keyof T]: ObjKeyof }[keyof T]; export type StripNever = Pick; export type Lookup = T extends any ? K extends keyof T ? T[K] : never : never; export type Flatten = T extends object ? StripNever<{ [K in KeyofKeyof]: Exclude | { [P in keyof T]: Lookup }[keyof T] }> : T export type FlattenDeep = Flatten>>>>; export type NamespacedModulesFor = { [P in keyof T]: P extends 'modules' ? (T[P] extends object ? { [M in keyof T[P]]: IsNamespacedModule extends never ? never : M }[keyof T[P]] : never ) : never }[keyof T]; export type MergedModulesFor = { [P in keyof T]: P extends 'modules' ? (T[P] extends object ? { [M in keyof T[P]]: IsNamespacedModule extends never ? M : never}[keyof T[P]] : never ) : never }[keyof T]; export type IsNamespacedModule = M extends object ? { [P in keyof M]: P extends 'namespaced' ? (M[P] extends true ? P : never) : never }[keyof M] : never; export type StateInputFor = { [K in StateKeys]: T[K]; } export type SubStateFor = { [M in NamespacedModulesFor]: T extends { modules: { [P in M]: object } } ? StateFor : never; } export type MergedStateFor = { [M in MergedModulesFor]: T extends { modules: { [P in M]: object } } ? StateFor : never; } export type StateFor = StateInputFor & SubStateFor & Flatten>; export type GettersForType = { [K in GetterKeys]: T[K]; } export type SubGettersFor = { [M in NamespacedModulesFor]: T extends { modules: { [P in M]: object } } ? GettersFor : never; } export type MergedGettersFor = { [M in MergedModulesFor]: T extends { modules: { [P in M]: object } } ? GettersFor : never; }