import { ActionReducer, Prettify, Primitive, Selector } from './models'; import { MemoizedSelector } from './selector'; export interface FeatureConfig { name: FeatureName; reducer: ActionReducer; } type Feature = FeatureConfig & BaseSelectors; type FeatureWithExtraSelectors = string extends keyof ExtraSelectors ? Feature : Omit, keyof ExtraSelectors> & ExtraSelectors; type FeatureSelector = { [K in FeatureName as `select${Capitalize}State`]: MemoizedSelector, FeatureState, (featureState: FeatureState) => FeatureState>; }; type NestedSelectors = FeatureState extends Primitive | unknown[] | Date ? {} : { [K in keyof FeatureState & string as `select${Capitalize}`]: MemoizedSelector, FeatureState[K], (featureState: FeatureState) => FeatureState[K]>; }; type BaseSelectors = FeatureSelector & NestedSelectors; type SelectorsDictionary = Record, unknown> | ((...args: any[]) => Selector, unknown>)>; type ExtraSelectorsFactory = (baseSelectors: BaseSelectors) => ExtraSelectors; type NotAllowedFeatureStateCheck = FeatureState extends Required ? unknown : 'optional properties are not allowed in the feature state'; /** * Creates a feature object with extra selectors. * * @param featureConfig An object that contains a feature name, a feature * reducer, and extra selectors factory. * @returns An object that contains a feature name, a feature reducer, * a feature selector, a selector for each feature state property, and * extra selectors. */ export declare function createFeature(featureConfig: FeatureConfig & { extraSelectors: ExtraSelectorsFactory; } & NotAllowedFeatureStateCheck): Prettify>; /** * Creates a feature object. * * @param featureConfig An object that contains a feature name and a feature * reducer. * @returns An object that contains a feature name, a feature reducer, * a feature selector, and a selector for each feature state property. */ export declare function createFeature(featureConfig: FeatureConfig & NotAllowedFeatureStateCheck): Prettify>; export {};