После еще нескольких копаний, я думаю, я понял это.В форме, показанной в вопросе (и обратите внимание, что существует 12 возможных шаблонов вызовов / типов connect
, вызванных в его файле определения типа - это только один), есть четыре параметра типа для connect
.Похоже, они представляют:
- TStateProps - тип, содержащий свойства, которые вы заполняете параметром
mapStateToProps
до connect
.(Это также случайный тип возврата функции mapStateToProps
) - TDispatchProps - тип, содержащий свойства, которые вы заполняете параметром
mapDispatchToProps
до connect
.(Это также случайный тип возврата функции mapDispatchToProps
) - TOwnProps - тип, содержащий свойства, оставшиеся для установки для new компонента, сгенерированного
connect
вызов (вот где я был в замешательстве.) TOwnProps также тип параметра ownProps
для mapStateToProps
и mapDispatchToProps
. - State - тип корневого каталога модели магазина Redux.
Нет.3, вызывая TOwnProps
, немного сбивает с толку, поскольку подразумевает связь с параметром ownProps
с функциями mapStateToProps
и mapDispatchToProps
.У меня никогда не было случая использовать ownProps
на практике, поэтому я не сразу понял, что на самом деле есть нечто большее, чем это.Проделав еще несколько копаний, я обнаружил, что connect
возвращает:
InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>
и определение этого:
export interface InferableComponentEnhancerWithProps<TInjectedProps, TNeedsProps> {
<C extends ComponentType<Matching<TInjectedProps, GetProps<C>>>>(
component: C
): ConnectedComponentClass<C, Omit<GetProps<C>, keyof Shared<TInjectedProps, GetProps<C>>> & TNeedsProps>
}
Видя TStateProps & TDispatchProps
, именуемые TInjectedProps
и TOwnProps
, именуемый TNeedsProps
, помогло немного сфокусироваться.TStateProps & TDispatchProps
- это свойства, «вставленные» в обернутый компонент с помощью connect
, а TOwnProps
- это свойства, которые оболочка все еще «нуждается» от потребителей подключенного компонента.
Другое понимание, которое я имел, состояло в том, что то, как у меня это было в вопросе (т. Е. connect<FooDataProps, FooDispatchProps, FooProps, Model>(mapStateToProps, mapDispatchToProps)
), не имеет смысла, потому что если бы параметр третьего типа (семантически) должен был представлять «все реквизиты, состояние илидиспетчеризация "система типов могла бы легко достичь этого, если бы &
ing FooDataProps
и FooDispatchProps
, что она получила в качестве параметра # 1 и # 2.Не было бы никакой новой информации, передаваемой с использованием этого третьего параметра типа, как я его использовал.
Ответ Мэтта Маккатчена , хотя и полезен, фокусируется только на роли TOwnProps
в отношениипараметр ownProps
для функций mapStateToProps
и mapDispatchToProps
.Он правильно заметил, что я не использую параметр ownProps
в этих функциях, и предложил передать {}
.Этот ответ кажется правильным для контекста, который он описывает, но он пренебрегает другой ролью TOwnProps
как определяющим фактором того, какие реквизиты могут быть приняты компонентом connect
ed высшего порядка.
Суммарный вывод о том, что TOwnProps
выполняет здесь двойную функцию, не только как тип для параметра ownProps
для функций карты, но и также как тип, фиксирующийсвойства, оставшиеся для установки потребителями упакованного / подключенного компонента.