@rematch/select
Version:
Selectors plugin for Rematch
64 lines • 6.54 kB
TypeScript
import { ExtractRematchStateFromModels, Models, Model, Action, RematchRootState, ModelReducers, ModelEffects, ModelEffectsCreator } from '@rematch/core';
import * as Reselect from 'reselect';
import { Store as ReduxStore, Reducer as ReduxReducer } from 'redux';
export { createSelector, createStructuredSelector } from 'reselect';
export declare type Selector<TState, TReturns, TProps = void> = TProps extends void ? (state: TState) => TReturns : (state: TState, props: TProps) => TReturns;
export declare type ExtractSelectorsFromModel<TModels extends Models<TModels>, TModel extends Model<TModels>> = TModel['selectors'] extends (...args: any[]) => infer TReturnObj ? TReturnObj : TModel['selectors'] extends Record<string, any> ? TModel['selectors'] : never;
export declare type ExtractSelectorsSignatureFromSelectorsModel<TRootState, TSelectorsConfigObject, TKey extends keyof TSelectorsConfigObject> = TSelectorsConfigObject[TKey] extends (...args: any[]) => infer TSelector ? TSelector extends (props: infer TProps) => Selector<any, infer TReturns> ? (props: TProps) => Selector<TRootState, TReturns> : TSelector extends Selector<any, infer TReturns> ? Selector<TRootState, TReturns> : TSelector extends Selector<any, infer TReturns, infer TProps> ? Selector<TRootState, TReturns, TProps> : never : never;
export interface SelectConfig<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> {
sliceState?: (state: ExtractRematchStateFromModels<TModels, TExtraModels>, model: Model<TModels>) => Record<string, any> | undefined;
selectorCreator?: any;
}
export declare type ModelSelectors<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TModel extends Model<TModels>> = {
[key in keyof ExtractSelectorsFromModel<TModels, TModel>]: ExtractSelectorsSignatureFromSelectorsModel<RematchRootState<TModels, TExtraModels>, ExtractSelectorsFromModel<TModels, TModel>, key>;
};
export declare type Slicer<TSliceState, TRootState> = (<TReturns>(resultFn: (slice: TSliceState) => TReturns) => Selector<TRootState, TReturns>) & Selector<TRootState, TSliceState>;
export interface ModelSelectorFactories<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any> {
[key: string]: SelectorFactory<TModels, TExtraModels, TSliceState> | SelectorParametricFactory<TModels, TExtraModels, TSliceState>;
}
export declare type StoreSelectors<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = {
[TModelKey in keyof TModels]: ModelSelectors<TModels, TExtraModels, TModels[TModelKey]>;
};
export declare type SelectorFactory<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any> = <TReturns>(this: ModelSelectorFactories<TModels, TExtraModels, TSliceState>, models: StoreSelectors<TModels, TExtraModels>) => Selector<RematchRootState<TModels>, TReturns>;
export declare type SelectorParametricFactory<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any, TProps = any, TReturns = any> = (this: ModelSelectorFactories<TModels, TExtraModels, TSliceState>, models: StoreSelectors<TModels, TExtraModels>, props: TProps) => Selector<RematchRootState<TModels>, TReturns, TProps>;
export declare type ParameterizerSelectorFactory<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any, TProps = any, TReturns = any> = (this: ModelSelectorFactories<TModels, TExtraModels, TSliceState>, models: StoreSelectors<TModels, TExtraModels>, props: TProps) => (props: TProps) => Selector<RematchRootState<TModels>, TReturns>;
export declare type Parameterizer<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any> = <TProps, TReturns>(factory: SelectorParametricFactory<TModels, TExtraModels, TSliceState, TProps, TReturns>) => ParameterizerSelectorFactory<TModels, TExtraModels, TSliceState, TProps, TReturns>;
export declare type ModelSelectorsFactory<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TSliceState = any> = (slice: Slicer<TSliceState, RematchRootState<TModels>>, createSelector: typeof Reselect.createSelector, hasProps: Parameterizer<TModels, TExtraModels, TSliceState>) => ModelSelectorFactories<TModels, TExtraModels, TSliceState>;
export declare type ModelSelectorsConfig<TModels extends Models<TModels>, TSliceState = any, TExtraModels extends Models<TModels> = Record<string, never>> = ModelSelectorsFactory<TModels, TExtraModels, TSliceState> | ModelSelectorFactories<TModels, TExtraModels, TSliceState>;
export declare type RematchSelect<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TRootState = RematchRootState<TModels, TExtraModels>> = (<TReturn extends {
[key: string]: (state: TRootState) => any;
}>(mapSelectToProps: (select: RematchSelect<TModels, TExtraModels>) => TReturn) => Reselect.OutputParametricSelector<TRootState, any, {
[K in keyof TReturn]: ReturnType<TReturn[K]>;
}, Reselect.Selector<TRootState, TRootState>> & Reselect.OutputSelector<TRootState, {
[K in keyof TReturn]: ReturnType<TReturn[K]>;
}, Reselect.Selector<TRootState, TRootState>>) & StoreSelectors<TModels, TExtraModels>;
declare module '/core' {
interface RematchStore<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> extends ReduxStore<RematchRootState<TModels, TExtraModels>, Action> {
select: RematchSelect<TModels, TExtraModels, RematchRootState<TModels, TExtraModels>>;
}
interface Model<TModels extends Models<TModels>, TState = any> {
selectors?: ModelSelectorsConfig<TModels, TState>;
}
interface ModelCreator {
<RM extends Models<RM>>(): <R extends ModelReducers<S> | undefined, BR extends ReduxReducer<BS> | undefined, E extends ModelEffects<RM> | ModelEffectsCreator<RM> | undefined, SE extends ModelSelectorsConfig<RM, S> | undefined, S, BS = S>(mo: {
name?: string;
state: S;
reducers?: R;
baseReducer?: BR;
effects?: E;
selectors?: SE;
}) => {
name?: string;
state: S;
} & (E extends undefined ? {} : {
effects: E;
}) & (R extends undefined ? {} : {
reducers: R;
}) & (BR extends undefined ? {} : {
baseReducer: BR;
}) & (SE extends undefined ? {} : {
selectors: SE;
});
}
}
//# sourceMappingURL=types.d.ts.map