Какой тип TypeScript следует использовать для ссылки на объект соответствия в моих реквизитах?

В моем Реагировать контейнеры/компонент, какой тип мог бы использовать для ссылки на match часть Включается Реагировать Router DOM?

interface Props {
  match: any // <= What could I use here instead of any?
}

export class ProductContainer extends React.Component<Props> {
  // ...
}

Ответы

Ответ 1

Вам не нужно добавлять его явно. Вы можете использовать RouteComponentProps<P> из @types/react-router RouteComponentProps<P> @types/react-router в качестве базового интерфейса ваших реквизитов. P - тип ваших параметров соответствия.

// example route
<Route path="/products/:name" component={ProductContainer} />

interface MatchParams {
    name: string;
}

interface Props extends RouteComponentProps<MatchParams> {
}

// from typings
export interface RouteComponentProps<P> {
  match: match<P>;
  location: H.Location;
  history: H.History;
  staticContext?: any;
}

export interface match<P> {
  params: P;
  isExact: boolean;
  path: string;
  url: string;
}

Ответ 2

Чтобы добавить ответ @azar554, приведенный выше, тип RouteComponentProps должен быть импортирован из RouteComponentProps react-router-dom и реализован следующим образом.

import {BrowserRouter as Router, Route, RouteComponentProps } from 'react-router-dom';

interface MatchParams {
    name: string;
}

interface MatchProps extends RouteComponentProps<MatchParams> {
}

Кроме того, чтобы разрешить повторное использование компонентов, функция render() позволяет передавать только то, что нужно компоненту, а не весь RouteComponentProps.

<Route path="/products/:name" render={( {match}: MatchProps) => (
    <ProductContainer name={match.params.name} /> )} />

// Now Product container takes a 'string', rather than a 'MatchProps'
// This allows us to use ProductContainer elsewhere, in a non-router setting!
const ProductContainer = ( {name}: string ) => {
     return (<h1>Product Container Named: {name}</h1>)
}