TypeScript | React Router Explicit Match Type

(Last edited: October 29, 2019)

One can correctly type the match of a component connected with withRouter or component names passed directly in the Route component by using the RouteComponentProps interface defined in 'react-router-dom'.

import { createBrowserHistory } from 'history'
import React, { FC, useEffect } from 'react'
import { render } from 'react-dom'
import { RouteComponentProps, Route, Router, Switch } from 'react-router-dom'

import './styles.css'

const browserHistory = createBrowserHistory()
const objectIdParameter = 'objectId'

interface IHomeProps  extends RouteComponentProps<{ [key in typeof objectIdParameter]: string }> {}
const Home: FC<IHomeProps> = ({ match }) => (
  <div>Home Page with id {match.params.objectId}</div>
)

const App: FC = () => {
  useEffect(() => {
    browserHistory.push('/42')
  }, [])

  return (
    <Router history={browserHistory}>
      <Switch>
        <Route component={Home} path={`/:${objectIdParameter}`} />
      </Switch>
    </Router>
  )
}

const rootElement = document.getElementById('root')
render(<App />, rootElement)

The above example can be seen in action in the below CodeSandbox: