@@ -17,13 +17,21 @@ export type ComparatorFn = (a: any, b: any) => boolean;
1717
1818export type DefaultProjectorFn < T > = ( ...args : any [ ] ) => T ;
1919
20+ export type ProjectorFn < Args extends unknown [ ] , T > = ( ...args : Args ) => T ;
21+
22+ export type StrictMemoizedSelector <
23+ Slices extends unknown [ ] ,
24+ Result ,
25+ State = unknown
26+ > = MemoizedSelector < State , Result , ( ...slices : Slices ) => Result > ;
27+
2028export interface MemoizedSelector <
2129 State ,
2230 Result ,
23- ProjectorFn = DefaultProjectorFn < Result >
31+ Projector = DefaultProjectorFn < Result >
2432> extends Selector < State , Result > {
2533 release ( ) : void ;
26- projector : ProjectorFn ;
34+ projector : Projector ;
2735 setResult : ( result ?: Result ) => void ;
2836 clearResult : ( ) => void ;
2937}
@@ -122,6 +130,22 @@ export function defaultMemoize(
122130 return { memoized, reset, setResult, clearResult } ;
123131}
124132
133+ export function createSelector <
134+ State ,
135+ Slices extends unknown [ ] ,
136+ Result ,
137+ IsStrict extends boolean
138+ > (
139+ ...args : [ ...Selector < State , unknown > [ ] , unknown , unknown ] &
140+ [
141+ ...{ [ i in keyof Slices ] : Selector < State , Slices [ i ] > } ,
142+ ( ...s : Slices ) => Result ,
143+ { strict : IsStrict }
144+ ]
145+ ) : IsStrict extends true
146+ ? StrictMemoizedSelector < Slices , Result , State >
147+ : MemoizedSelector < State , Result > ;
148+
125149export function createSelector < State , Slices extends unknown [ ] , Result > (
126150 ...args : [ ...Selector < State , unknown > [ ] , unknown ] &
127151 [
@@ -272,6 +296,20 @@ export function createSelector<
272296 ) => Result
273297) : MemoizedSelectorWithProps < State , Props , Result > ;
274298
299+ export function createSelector <
300+ State ,
301+ Slices extends unknown [ ] ,
302+ Result ,
303+ IsStrict extends boolean
304+ > (
305+ selectors : Selector < State , unknown > [ ] &
306+ [ ...{ [ i in keyof Slices ] : Selector < State , Slices [ i ] > } ] ,
307+ projector : ( ...s : Slices ) => Result ,
308+ options : { strict : IsStrict }
309+ ) : IsStrict extends true
310+ ? StrictMemoizedSelector < Slices , Result , State >
311+ : MemoizedSelector < State , Result > ;
312+
275313export function createSelector < State , Slices extends unknown [ ] , Result > (
276314 selectors : Selector < State , unknown > [ ] &
277315 [ ...{ [ i in keyof Slices ] : Selector < State , Slices [ i ] > } ] ,
0 commit comments