I found a way to get type safety when using mapStateToProps
from react-redux
: as documented you can define an interface and parameterize React.Component<T>
with your interface.
However, when I am defining mapStateToProps
, I'm already defining a function where the types of the properties of the resulting object can be inferred. Eg,
function mapStateToProps(state: MyState) {
return {
counter: state.counter
};
}
Here, the prop counter
can be inferred to be the same type as state.counter
. But I still have to have boilerplate code like the following:
interface AppProps {
counter: number;
}
class App extends React.Component<AppProps> { ... }
export default connect(mapStateToProps)(App);
So the question is, is there any way to structure the code so that I can avoid writing the type of counter
twice? Or to avoid parameterizing the type of React.Component
-- even if I could have the props of the component inferred from an explicitly-hinted result type of the mapStateToProps
function, that would be preferable. I am wondering if the duplication above is indeed the normal way to write typed components using React-Redux.
I don't think so. You could make your setup more concise by using Redux hooks: https://react-redux.js.org/next/api/hooks
Edit: You can if you just use the same
MyState
type. But I don't think you would want that.I would type mapped dispatch props, and component props separately and then combine the inferred type of the mapped state to props function. See below for a quick example. There might be a more elegant solution but hopefully, it will hopefully get you on the right track.
Yes. There's a neat technique for inferring the type of the combined props that
connect
will pass to your component based onmapState
andmapDispatch
.There is a new
ConnectedProps<T>
type that is available in@types/react-redux@7.1.2
. You can use it like this:Note that this correctly infers the type of thunk action creators included in
mapDispatch
if it's an object, whereastypeof mapDispatch
does not.We will add this to the official React-Redux docs as a recommended approach soon.
More details: