typescript - ReactJS TS, Egenskapen 'match' finns inte på typen 'Readonly<{children?:ReactNode}> & Readonly'
Jag försöker skriva typen på mina komponentprops och använda en URL-parameter samtidigt. Jag får följande fel:
Egenskapen 'match' finns inte på typen 'Readonly<{children?: ReactNode}> & Readonly'
Här är en del av min kod:
import Api from '../../api/Api';
interface MyProps {
api: Api
}
interface MyState {
someString: string,
loading: boolean
}
export class MyComponent extends React.Component<MyProps, MyState> {
constructor(props: MyProps) {
super(props);
this.state = {
someString: this.props.match.params.someString,//<-- Error is here on this line
loading: true
}
}
componentDidMount() {
this.props.api.getSomeInfo(this.state.someString, this.callback)
}
callback() {
let interval = setInterval(function () {
this.setState({loading: false});
clearInterval(interval)
}, 3000);
}
render() {
return (
<div>
<p>{this.someString}</p>
</div>
);
}
}
Som du kan se är allt jag försöker göra:
1- Gå till:
http://localhost:8080/someStrings/:someString
2- Hämta värdet av :someString i min komponents konstruktor och lagra det i tillståndet
3- Använd värdet av someString i mitt state för att kunna skicka det som ett argument till mitt API-modul för att göra saker
4- När återuppringningen körs i API:t tar jag bort laddningsanimationen
Min fråga är i princip, hur deklarerar jag mina MyProps för att kunna uppnå detta?
Svar #1
Detta är en öppen fråga i typdefinitionen. https://github.com/DefinitelyTyped/DefinitelyTyped/issues/17355
Tillfällig lösning
import { RouteProps } from 'react-router';
import React from 'react';
interface MyProps {
api: Api
}
interface MyState {
someString: string,
loading: boolean
}
class MyComponent extends React.Component<Props & RouteProps, State> // Pay attention here.
{
// your code...
}
ref: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/17355#issuecomment-336022780
Svar #2
Så här löste jag det
import {RouteComponentProps} from 'react-router';
interface IMyProps {}
interface IReactRouterParams {
roomName: string;
username: string;
}
export class MyComponent extends React.Component<
IMyProps & RouteComponentProps<IReactRouterParams> {
constructor(props: any) {
super(props);
//everything works here
const {roomName, username} = this.props.match.params;
}
}
