Какой тип 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>)
}