В моем дочернем компоненте я определяю MapDispatchToProps, передаю их в connect и, соответственно, определяю интерфейс PropsFromDispatch, который расширен в React.Component Props Interface.Теперь в моем родительском компоненте Typescript говорит мне, что ему не хватает свойств, которые я определил в PropsFromDispatch.
Это не кажется абсурдным, так как я определяю их как часть интерфейса React.Component Props,однако я ожидал бы, что 'connect' позаботится об этом так же, как он заботится о моем PropsFromState, который мне также не нужно передавать от родительского к дочернему компоненту, но отображается из состояния в Props.
/ JokeModal.tsx
...
interface Props extends PropsFromState, PropsFromDispatch {
isOpen: boolean
renderButton: boolean
}
...
const mapDispatchToProps = (dispatch: Dispatch<any>):
PropsFromDispatch => {
return {
tellJoke: (newJoke: INewJoke) => dispatch(tellJoke(newJoke)),
clearErrors: () => dispatch(clearErrors())
}
}
interface PropsFromDispatch {
tellJoke: (newJoke: INewJoke) => void
clearErrors: () => void
}
...
export default connect(mapStateToProps, mapDispatchToProps)(JokeModal);
/ Parent.tsx
...
button = <JokeModal isOpen={false} renderButton={true} />
...
В этой строке /Parent.tsx Typescript теперь говорит мне:
Type '{ isOpen: false; renderButton: true; }' is missing the
following properties from type 'Readonly<Pick<Props, "isOpen" |
"renderButton" | "tellJoke" | "clearErrors">>': tellJoke, clearErrors
ts(2739)
Интересно, что я могу полностью избежать этой ошибки, удалив MapDispatchToProps и вместо этого передавая действия непосредственно в connect (включая диспетчеризацию уже в создателе действий):
export default connect(mapStateToProps, { tellJoke, clearErrors })(JokeModal);
Тем не менее, я хотел бы знать, какиспользовать MapDispatchToProps здесь, а также почему Typescript ожидает от меня передачи этих действий дочернему компоненту?
Рад услышать ваш совет!