diff --git a/src/connect/selectorFactory.ts b/src/connect/selectorFactory.ts index 8f3c4b73d..fd5dea5f9 100644 --- a/src/connect/selectorFactory.ts +++ b/src/connect/selectorFactory.ts @@ -3,7 +3,7 @@ import verifySubselectors from './verifySubselectors' import type { EqualityFn } from '../types' export type SelectorFactory = ( - dispatch: Dispatch, + dispatch: Dispatch>, factoryOptions: TFactoryOptions ) => Selector @@ -13,24 +13,24 @@ export type Selector = TOwnProps extends ? (state: S) => TProps : (state: S, ownProps: TOwnProps) => TProps -export type MapStateToProps = ( +export type MapStateToProps = ( state: State, ownProps: TOwnProps ) => TStateProps -export type MapStateToPropsFactory = ( +export type MapStateToPropsFactory = ( initialState: State, ownProps: TOwnProps ) => MapStateToProps -export type MapStateToPropsParam = +export type MapStateToPropsParam = | MapStateToPropsFactory | MapStateToProps | null | undefined export type MapDispatchToPropsFunction = ( - dispatch: Dispatch, + dispatch: Dispatch>, ownProps: TOwnProps ) => TDispatchProps @@ -39,7 +39,7 @@ export type MapDispatchToProps = | TDispatchProps export type MapDispatchToPropsFactory = ( - dispatch: Dispatch, + dispatch: Dispatch>, ownProps: TOwnProps ) => MapDispatchToPropsFunction @@ -57,10 +57,10 @@ export type MergeProps = ( ownProps: TOwnProps ) => TMergedProps -interface PureSelectorFactoryComparisonOptions { +interface PureSelectorFactoryComparisonOptions { areStatesEqual: EqualityFn areOwnPropsEqual: EqualityFn - areStatePropsEqual: EqualityFn + areStatePropsEqual: EqualityFn displayName: string } @@ -69,21 +69,17 @@ export function pureFinalPropsSelectorFactory< TOwnProps, TDispatchProps, TMergedProps, - State = unknown + State >( - mapStateToProps: MapStateToPropsParam & { - dependsOnOwnProps: boolean - }, - mapDispatchToProps: MapDispatchToPropsParam & { - dependsOnOwnProps: boolean - }, + mapStateToProps: WrappedMapStateToProps, + mapDispatchToProps: WrappedMapDispatchToProps, mergeProps: MergeProps, - dispatch: Dispatch, + dispatch: Dispatch>, { areStatesEqual, areOwnPropsEqual, areStatePropsEqual, - }: PureSelectorFactoryComparisonOptions + }: PureSelectorFactoryComparisonOptions ) { let hasRunAtLeastOnce = false let state: State @@ -95,21 +91,17 @@ export function pureFinalPropsSelectorFactory< function handleFirstCall(firstState: State, firstOwnProps: TOwnProps) { state = firstState ownProps = firstOwnProps - // @ts-ignore - stateProps = mapStateToProps!(state, ownProps) - // @ts-ignore - dispatchProps = mapDispatchToProps!(dispatch, ownProps) + stateProps = mapStateToProps(state, ownProps) + dispatchProps = mapDispatchToProps(dispatch, ownProps) mergedProps = mergeProps(stateProps, dispatchProps, ownProps) hasRunAtLeastOnce = true return mergedProps } function handleNewPropsAndNewState() { - // @ts-ignore - stateProps = mapStateToProps!(state, ownProps) + stateProps = mapStateToProps(state, ownProps) - if (mapDispatchToProps!.dependsOnOwnProps) - // @ts-ignore + if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps) mergedProps = mergeProps(stateProps, dispatchProps, ownProps) @@ -117,12 +109,10 @@ export function pureFinalPropsSelectorFactory< } function handleNewProps() { - if (mapStateToProps!.dependsOnOwnProps) - // @ts-ignore - stateProps = mapStateToProps!(state, ownProps) + if (mapStateToProps.dependsOnOwnProps) + stateProps = mapStateToProps(state, ownProps) if (mapDispatchToProps.dependsOnOwnProps) - // @ts-ignore dispatchProps = mapDispatchToProps(dispatch, ownProps) mergedProps = mergeProps(stateProps, dispatchProps, ownProps) @@ -132,7 +122,6 @@ export function pureFinalPropsSelectorFactory< function handleNewState() { const nextStateProps = mapStateToProps(state, ownProps) const statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps) - // @ts-ignore stateProps = nextStateProps if (statePropsChanged) @@ -163,24 +152,34 @@ export function pureFinalPropsSelectorFactory< } } +interface WrappedMapStateToProps { + (state: State, ownProps: TOwnProps): TStateProps + readonly dependsOnOwnProps: boolean +} + +interface WrappedMapDispatchToProps { + (dispatch: Dispatch>, ownProps: TOwnProps): TDispatchProps + readonly dependsOnOwnProps: boolean +} + export interface SelectorFactoryOptions< TStateProps, TOwnProps, TDispatchProps, TMergedProps, - State = unknown -> extends PureSelectorFactoryComparisonOptions { + State +> extends PureSelectorFactoryComparisonOptions { initMapStateToProps: ( dispatch: Dispatch, - options: PureSelectorFactoryComparisonOptions - ) => MapStateToPropsParam + options: PureSelectorFactoryComparisonOptions + ) => WrappedMapStateToProps initMapDispatchToProps: ( dispatch: Dispatch, - options: PureSelectorFactoryComparisonOptions - ) => MapDispatchToPropsParam + options: PureSelectorFactoryComparisonOptions + ) => WrappedMapDispatchToProps initMergeProps: ( dispatch: Dispatch, - options: PureSelectorFactoryComparisonOptions + options: PureSelectorFactoryComparisonOptions ) => MergeProps } @@ -195,9 +194,9 @@ export default function finalPropsSelectorFactory< TOwnProps, TDispatchProps, TMergedProps, - State = unknown + State >( - dispatch: Dispatch, + dispatch: Dispatch>, { initMapStateToProps, initMapDispatchToProps, @@ -225,6 +224,5 @@ export default function finalPropsSelectorFactory< TDispatchProps, TMergedProps, State - // @ts-ignore - >(mapStateToProps!, mapDispatchToProps, mergeProps, dispatch, options) + >(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options) }