/** A standard selector function, which takes three generic type arguments: * @param State The first value, often a Redux root state object * @param Result The final result returned by the selector * @param Params All additional arguments passed into the selector */ export declare type Selector = [Params] extends [never] ? (state: State) => Result : (state: State, ...params: Params) => Result; /** Selectors generated by Reselect have several additional fields attached: */ export interface OutputSelectorFields { /** The final function passed to `createSelector` */ resultFunc: Combiner; /** The same function, memoized */ memoizedResultFunc: Combiner; /** Returns the last result calculated by the selector */ lastResult: () => ReturnType; /** An array of the input selectors */ dependencies: SelectorArray; /** Counts the number of times the output has been recalculated */ recomputations: () => number; /** Resets the count of recomputations count to 0 */ resetRecomputations: () => number; } /** Represents the actual selectors generated by `createSelector`. * The selector is: * - "a function that takes this state + params and returns a result" * - plus the attached additional fields */ export declare type OutputSelector = Selector, Result, Params> & OutputSelectorFields; /** A selector that is assumed to have one additional argument, such as * the props from a React component */ export declare type ParametricSelector = Selector; /** A generated selector that is assumed to have one additional argument */ export declare type OutputParametricSelector = ParametricSelector & OutputSelectorFields; /** An array of input selectors */ export declare type SelectorArray = ReadonlyArray; /** A standard function returning true if two values are considered equal */ export declare type EqualityFn = (a: any, b: any) => boolean; /** Extracts an array of all return types from all input selectors */ export declare type SelectorResultArray = ExtractReturnType; /** Determines the combined single "State" type (first arg) from all input selectors */ export declare type GetStateFromSelectors = MergeParameters[0]; /** Determines the combined "Params" type (all remaining args) from all input selectors */ export declare type GetParamsFromSelectors>> = RemainingItems; /** Given a set of input selectors, extracts the intersected parameters to determine * what values can actually be passed to all of the input selectors at once * WARNING: "you are not expected to understand this" :) */ export declare type MergeParameters, TransposedArrays = Transpose, TuplifiedArrays extends any[] = TuplifyUnion, LongestParamsArray extends readonly any[] = LongestArray> = ExpandItems> : never; }>>; /** Any function with arguments */ export declare type UnknownFunction = (...args: any[]) => any; /** An object with no fields */ declare type EmptyObject = { [K in any]: never; }; declare type IgnoreInvalidIntersections = T extends EmptyObject ? never : T; /** Extract the parameters from all functions as a tuple */ export declare type ExtractParams = { [index in keyof T]: T[index] extends T[number] ? Parameters : never; }; /** Extract the return type from all functions as a tuple */ export declare type ExtractReturnType = { [index in keyof T]: T[index] extends T[number] ? ReturnType : never; }; /** Recursively expand all fields in an object for easier reading */ export declare type ExpandItems = { [index in keyof T]: T[index] extends T[number] ? Expand : never; }; /** First item in an array */ export declare type Head = T extends [any, ...any[]] ? T[0] : never; /** All other items in an array */ export declare type Tail = A extends [any, ...infer Rest] ? Rest : never; /** Extract only numeric keys from an array type */ export declare type AllArrayKeys = A extends any ? { [K in keyof A]: K; }[number] : never; export declare type List = ReadonlyArray; export declare type Has = [U1] extends [U] ? 1 : 0; /** Select the longer of two arrays */ export declare type Longest = L extends unknown ? L1 extends unknown ? { 0: L1; 1: L; }[Has] : never : never; /** Recurse over a nested array to locate the longest one. * Acts like a type-level `reduce()` */ export declare type LongestArray = IsTuple extends '0' ? S[0] : S extends [any[], any[]] ? Longest : S extends [any[], any[], ...infer Rest] ? Longest, Rest extends any[][] ? LongestArray : []> : S extends [any[]] ? S[0] : never; /** Recursive type for intersecting together all items in a tuple, to determine * the final parameter type at a given argument index in the generated selector. */ export declare type IntersectAll = IsTuple extends '0' ? T[0] : _IntersectAll; declare type IfJustNullish = [T] extends [undefined | null] ? True : False; /** Intersect a pair of types together, for use in parameter type calculation. * This is made much more complex because we need to correctly handle cases * where a function has fewer parameters and the type is `undefined`, as well as * optional params or params that have `null` or `undefined` as part of a union. * * If the next type by itself is `null` or `undefined`, we exclude it and return * the other type. Otherwise, intersect them together. */ declare type _IntersectAll = T extends [infer First, ...infer Rest] ? _IntersectAll> : R; /** The infamous "convert a union type to an intersection type" hack * Source: https://github.com/sindresorhus/type-fest/blob/main/source/union-to-intersection.d.ts * Reference: https://github.com/microsoft/TypeScript/issues/29594 */ export declare type UnionToIntersection = (Union extends unknown ? (distributedUnion: Union) => void : never) extends (mergedIntersection: infer Intersection) => void ? Intersection : never; /** * Removes field names from a tuple * Source: https://stackoverflow.com/a/63571175/62937 */ declare type RemoveNames = [any, ...T] extends [ any, ...infer U ] ? U : never; /** * Assorted util types for type-level conditional logic * Source: https://github.com/KiaraGrouwstra/typical */ export declare type Bool = '0' | '1'; export declare type Obj = { [k: string]: T; }; export declare type And = ({ 1: { 1: '1'; } & Obj<'0'>; } & Obj>)[A][B]; export declare type Matches = V extends T ? '1' : '0'; export declare type IsArrayType = Matches; export declare type Not = { '1': '0'; '0': '1'; }[T]; export declare type InstanceOf = And, Not>>; export declare type IsTuple = And, InstanceOf>; /** * Code to convert a union of values into a tuple. * Source: https://stackoverflow.com/a/55128956/62937 */ declare type Push = [...T, V]; declare type LastOf = UnionToIntersection T : never> extends () => infer R ? R : never; declare type TuplifyUnion, N = [T] extends [never] ? true : false> = true extends N ? [] : Push>, L>; /** * Converts "the values of an object" into a tuple, like a type-level `Object.values()` * Source: https://stackoverflow.com/a/68695508/62937 */ export declare type ObjValueTuple, R extends any[] = []> = KS extends [infer K, ...infer KT] ? ObjValueTuple : R; /** * Transposes nested arrays * Source: https://stackoverflow.com/a/66303933/62937 */ declare type Transpose = T[Extract] extends infer V ? { [K in keyof V]: { [L in keyof T]: K extends keyof T[L] ? T[L][K] : undefined; }; } : never; /** Utility type to infer the type of "all params of a function except the first", so we can determine what arguments a memoize function accepts */ export declare type DropFirst = T extends [unknown, ...infer U] ? U : never; /** * Expand an item a single level, or recursively. * Source: https://stackoverflow.com/a/69288824/62937 */ export declare type Expand = T extends (...args: infer A) => infer R ? (...args: Expand) => Expand : T extends infer O ? { [K in keyof O]: O[K]; } : never; export declare type ExpandRecursively = T extends (...args: infer A) => infer R ? (...args: ExpandRecursively) => ExpandRecursively : T extends object ? T extends infer O ? { [K in keyof O]: ExpandRecursively; } : never : T; declare type Identity = T; /** * Another form of type value expansion * Source: https://github.com/microsoft/TypeScript/issues/35247 */ export declare type Mapped = Identity<{ [k in keyof T]: T[k]; }>; export declare type If2 = B extends 1 ? Then : Else; export declare type Boolean2 = 0 | 1; export declare type Key = string | number | symbol; export declare type BuiltIn = Function | Error | Date | { readonly [Symbol.toStringTag]: string; } | RegExp | Generator; export {};