Skip to content

Commit a8fd20e

Browse files
committed
Reuse the Connect type + overloads from the v7 typedefs
1 parent 9af432b commit a8fd20e

File tree

3 files changed

+166
-184
lines changed

3 files changed

+166
-184
lines changed

src/components/connect.tsx

Lines changed: 154 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -260,183 +260,163 @@ export interface ConnectOptions<
260260
) => boolean
261261
}
262262

263-
/* @public */
264-
function connect(): InferableComponentEnhancer<DispatchProp>
263+
/**
264+
* Connects a React component to a Redux store.
265+
*
266+
* - Without arguments, just wraps the component, without changing the behavior / props
267+
*
268+
* - If 2 params are passed (3rd param, mergeProps, is skipped), default behavior
269+
* is to override ownProps (as stated in the docs), so what remains is everything that's
270+
* not a state or dispatch prop
271+
*
272+
* - When 3rd param is passed, we don't know if ownProps propagate and whether they
273+
* should be valid component props, because it depends on mergeProps implementation.
274+
* As such, it is the user's responsibility to extend ownProps interface from state or
275+
* dispatch props or both when applicable
276+
*
277+
* @param mapStateToProps
278+
* @param mapDispatchToProps
279+
* @param mergeProps
280+
* @param options
281+
*/
282+
export interface Connect<DefaultState = DefaultRootState> {
283+
// tslint:disable:no-unnecessary-generics
284+
(): InferableComponentEnhancer<DispatchProp>
285+
286+
/** mapState only */
287+
<TStateProps = {}, no_dispatch = {}, TOwnProps = {}, State = DefaultState>(
288+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>
289+
): InferableComponentEnhancerWithProps<TStateProps & DispatchProp, TOwnProps>
290+
291+
/** mapDispatch only (as a function) */
292+
<no_state = {}, TDispatchProps = {}, TOwnProps = {}>(
293+
mapStateToProps: null | undefined,
294+
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>
295+
): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps>
296+
297+
/** mapDispatch only (as an object) */
298+
<no_state = {}, TDispatchProps = {}, TOwnProps = {}>(
299+
mapStateToProps: null | undefined,
300+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
301+
): InferableComponentEnhancerWithProps<
302+
ResolveThunks<TDispatchProps>,
303+
TOwnProps
304+
>
265305

266-
/* @public */
267-
function connect<
268-
TStateProps = {},
269-
no_dispatch = {},
270-
TOwnProps = {},
271-
State = DefaultRootState
272-
>(
273-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>
274-
): InferableComponentEnhancerWithProps<
275-
TStateProps & DispatchProp,
276-
TOwnProps & ConnectProps
277-
>
278-
279-
/* @public */
280-
function connect<no_state = {}, TDispatchProps = {}, TOwnProps = {}>(
281-
mapStateToProps: null | undefined,
282-
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>
283-
): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps & ConnectProps>
284-
285-
/* @public */
286-
function connect<no_state = {}, TDispatchProps = {}, TOwnProps = {}>(
287-
mapStateToProps: null | undefined,
288-
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
289-
): InferableComponentEnhancerWithProps<
290-
ResolveThunks<TDispatchProps>,
291-
TOwnProps & ConnectProps
292-
>
293-
294-
/* @public */
295-
function connect<
296-
TStateProps = {},
297-
TDispatchProps = {},
298-
TOwnProps = {},
299-
State = DefaultRootState
300-
>(
301-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
302-
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>
303-
): InferableComponentEnhancerWithProps<
304-
TStateProps & TDispatchProps,
305-
TOwnProps & ConnectProps
306-
>
307-
308-
/* @public */
309-
function connect<
310-
TStateProps = {},
311-
TDispatchProps = {},
312-
TOwnProps = {},
313-
State = DefaultRootState
314-
>(
315-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
316-
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
317-
): InferableComponentEnhancerWithProps<
318-
TStateProps & ResolveThunks<TDispatchProps>,
319-
TOwnProps & ConnectProps
320-
>
321-
322-
/* @public */
323-
function connect<
324-
no_state = {},
325-
no_dispatch = {},
326-
TOwnProps = {},
327-
TMergedProps = {}
328-
>(
329-
mapStateToProps: null | undefined,
330-
mapDispatchToProps: null | undefined,
331-
mergeProps: MergeProps<undefined, undefined, TOwnProps, TMergedProps>
332-
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps & ConnectProps>
306+
/** mapState and mapDispatch (as a function)*/
307+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(
308+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
309+
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>
310+
): InferableComponentEnhancerWithProps<
311+
TStateProps & TDispatchProps,
312+
TOwnProps
313+
>
333314

334-
/* @public */
335-
function connect<
336-
TStateProps = {},
337-
no_dispatch = {},
338-
TOwnProps = {},
339-
TMergedProps = {},
340-
State = DefaultRootState
341-
>(
342-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
343-
mapDispatchToProps: null | undefined,
344-
mergeProps: MergeProps<TStateProps, undefined, TOwnProps, TMergedProps>
345-
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps & ConnectProps>
315+
/** mapState and mapDispatch (as an object) */
316+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(
317+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
318+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
319+
): InferableComponentEnhancerWithProps<
320+
TStateProps & ResolveThunks<TDispatchProps>,
321+
TOwnProps
322+
>
346323

347-
/* @public */
348-
function connect<
349-
no_state = {},
350-
TDispatchProps = {},
351-
TOwnProps = {},
352-
TMergedProps = {}
353-
>(
354-
mapStateToProps: null | undefined,
355-
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
356-
mergeProps: MergeProps<undefined, TDispatchProps, TOwnProps, TMergedProps>
357-
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps & ConnectProps>
324+
/** mergeProps only */
325+
<no_state = {}, no_dispatch = {}, TOwnProps = {}, TMergedProps = {}>(
326+
mapStateToProps: null | undefined,
327+
mapDispatchToProps: null | undefined,
328+
mergeProps: MergeProps<undefined, undefined, TOwnProps, TMergedProps>
329+
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>
330+
331+
/** mapState and mergeProps */
332+
<
333+
TStateProps = {},
334+
no_dispatch = {},
335+
TOwnProps = {},
336+
TMergedProps = {},
337+
State = DefaultState
338+
>(
339+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
340+
mapDispatchToProps: null | undefined,
341+
mergeProps: MergeProps<TStateProps, undefined, TOwnProps, TMergedProps>
342+
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>
343+
344+
/** mapDispatch (as a object) and mergeProps */
345+
<no_state = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(
346+
mapStateToProps: null | undefined,
347+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
348+
mergeProps: MergeProps<undefined, TDispatchProps, TOwnProps, TMergedProps>
349+
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>
350+
351+
/** mapState and options */
352+
<TStateProps = {}, no_dispatch = {}, TOwnProps = {}, State = DefaultState>(
353+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
354+
mapDispatchToProps: null | undefined,
355+
mergeProps: null | undefined,
356+
options: ConnectOptions<State, TStateProps, TOwnProps>
357+
): InferableComponentEnhancerWithProps<DispatchProp & TStateProps, TOwnProps>
358+
359+
/** mapDispatch (as a function) and options */
360+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
361+
mapStateToProps: null | undefined,
362+
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,
363+
mergeProps: null | undefined,
364+
options: ConnectOptions<{}, TStateProps, TOwnProps>
365+
): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps>
366+
367+
/** mapDispatch (as an object) and options*/
368+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
369+
mapStateToProps: null | undefined,
370+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
371+
mergeProps: null | undefined,
372+
options: ConnectOptions<{}, TStateProps, TOwnProps>
373+
): InferableComponentEnhancerWithProps<
374+
ResolveThunks<TDispatchProps>,
375+
TOwnProps
376+
>
358377

359-
/* @public */
360-
// @ts-ignore
361-
function connect<
362-
TStateProps = {},
363-
no_dispatch = {},
364-
TOwnProps = {},
365-
State = DefaultRootState
366-
>(
367-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
368-
mapDispatchToProps: null | undefined,
369-
mergeProps: null | undefined,
370-
options: ConnectOptions<State, TStateProps, TOwnProps>
371-
): InferableComponentEnhancerWithProps<
372-
DispatchProp & TStateProps,
373-
TOwnProps & ConnectProps
374-
>
375-
376-
/* @public */
377-
function connect<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
378-
mapStateToProps: null | undefined,
379-
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,
380-
mergeProps: null | undefined,
381-
options: ConnectOptions<{}, TStateProps, TOwnProps>
382-
): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps & ConnectProps>
383-
384-
/* @public */
385-
function connect<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
386-
mapStateToProps: null | undefined,
387-
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
388-
mergeProps: null | undefined,
389-
options: ConnectOptions<{}, TStateProps, TOwnProps>
390-
): InferableComponentEnhancerWithProps<
391-
ResolveThunks<TDispatchProps>,
392-
TOwnProps & ConnectProps
393-
>
394-
395-
/* @public */
396-
function connect<
397-
TStateProps = {},
398-
TDispatchProps = {},
399-
TOwnProps = {},
400-
State = DefaultRootState
401-
>(
402-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
403-
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,
404-
mergeProps: null | undefined,
405-
options: ConnectOptions<State, TStateProps, TOwnProps>
406-
): InferableComponentEnhancerWithProps<
407-
TStateProps & TDispatchProps,
408-
TOwnProps & ConnectProps
409-
>
410-
411-
/* @public */
412-
function connect<
413-
TStateProps = {},
414-
TDispatchProps = {},
415-
TOwnProps = {},
416-
State = DefaultRootState
417-
>(
418-
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
419-
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
420-
mergeProps: null | undefined,
421-
options: ConnectOptions<State, TStateProps, TOwnProps>
422-
): InferableComponentEnhancerWithProps<
423-
TStateProps & ResolveThunks<TDispatchProps>,
424-
TOwnProps & ConnectProps
425-
>
426-
427-
/* @public */
428-
function connect<
429-
TStateProps = {},
430-
TDispatchProps = {},
431-
TOwnProps = {},
432-
TMergedProps = {},
433-
State = DefaultRootState
434-
>(
435-
mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, State>,
436-
mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
437-
mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
438-
options?: ConnectOptions<State, TStateProps, TOwnProps, TMergedProps>
439-
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps & ConnectProps>
378+
/** mapState, mapDispatch (as a function), and options */
379+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(
380+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
381+
mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,
382+
mergeProps: null | undefined,
383+
options: ConnectOptions<State, TStateProps, TOwnProps>
384+
): InferableComponentEnhancerWithProps<
385+
TStateProps & TDispatchProps,
386+
TOwnProps
387+
>
388+
389+
/** mapState, mapDispatch (as an object), and options */
390+
<TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(
391+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
392+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
393+
mergeProps: null | undefined,
394+
options: ConnectOptions<State, TStateProps, TOwnProps>
395+
): InferableComponentEnhancerWithProps<
396+
TStateProps & ResolveThunks<TDispatchProps>,
397+
TOwnProps
398+
>
399+
400+
/** mapState, mapDispatch, mergeProps, and options */
401+
<
402+
TStateProps = {},
403+
TDispatchProps = {},
404+
TOwnProps = {},
405+
TMergedProps = {},
406+
State = DefaultState
407+
>(
408+
mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
409+
mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
410+
mergeProps: MergeProps<
411+
TStateProps,
412+
TDispatchProps,
413+
TOwnProps,
414+
TMergedProps
415+
>,
416+
options?: ConnectOptions<State, TStateProps, TOwnProps, TMergedProps>
417+
): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>
418+
// tslint:enable:no-unnecessary-generics
419+
}
440420

441421
/**
442422
* Connects a React component to a Redux store.
@@ -826,4 +806,4 @@ function connect<
826806
return wrapWithConnect
827807
}
828808

829-
export default connect
809+
export default connect as Connect

src/connect/selectorFactory.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -231,14 +231,12 @@ export default function finalPropsSelectorFactory<
231231
verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps)
232232
}
233233

234-
const selectorFactory = pureFinalPropsSelectorFactory
235-
236-
return selectorFactory(
234+
return pureFinalPropsSelectorFactory<
235+
TStateProps,
236+
TOwnProps,
237+
TDispatchProps,
238+
TMergedProps,
239+
State
237240
// @ts-ignore
238-
mapStateToProps!,
239-
mapDispatchToProps,
240-
mergeProps,
241-
dispatch,
242-
options
243-
)
241+
>(mapStateToProps!, mapDispatchToProps, mergeProps, dispatch, options)
244242
}

src/exports.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import Provider from './components/Provider'
22
import type { ProviderProps } from './components/Provider'
3-
import connect, { ConnectProps, ConnectedProps } from './components/connect'
3+
import connect, {
4+
Connect,
5+
ConnectedProps,
6+
} from './components/connect'
47
import type {
58
SelectorFactory,
69
Selector,
@@ -47,6 +50,7 @@ export {
4750
Provider,
4851
ReactReduxContext,
4952
connect,
53+
Connect,
5054
useDispatch,
5155
createDispatchHook,
5256
useSelector,

0 commit comments

Comments
 (0)