TypeScriptを使用して、パラメーターを受け入れる方法でreact-routerをセットアップしようとしています。
私のrender
要素に
<Route path="/show/:id" component={TestComp} />
そして、私はTestComp
を次のように定義します
const TestComp = ({ match }) => (
<div>
<h2>Showing specified ID: {match.params.id}</h2>
</div>
)
ただし、VS Codeはmatch
パラメータに(TestComp
の宣言で)下線を引いて教えてくれます
バインド要素 'match'は暗黙的に 'any'タイプを持っています。
コンパイルに失敗します。
どのタイプmatch
を宣言する必要があるかを誰かに教えてもらえますか?私はRouteProps
を試しましたが、それもうまくいきません。 index.d.tsを見ると、match<P>
として定義されていると思いますが、パラメーターをジェネリック型として宣言する方法がわかりません。
[〜#〜]更新[〜#〜]
@ TarasPolovyiの回答へのコメントに基づいて、以下を追加しました。
ご覧のとおり、これにはまだ問題があります。
react-router
v4を使用している場合は、react-router-dom
からRouteComponentProps
をインポートし、タイプRouteComponentProps<RouteInfo>
を使用します-引数名は一致する必要があります
まず、react-router-dom
からmatch
をインポートする必要があります。
これは、create react appから生成された私のコードのコピーです。
import {
BrowserRouter as Router,
Route,
Link,
match
} from 'react-router-dom';
次のようなインターフェースが必要です。
interface Identifiable {id: string; }
match
は必要なものです。このような:
const TestComp = (mathedRoute: match<Identifiable>) => (
<div>
<h2>Showing specified ID: {mathedRoute.params.id}</h2>
</div>
)
@types/react-router
の型宣言があるパッケージreact-router
をインストールする必要があります。インターフェースmatch<P>
が含まれているため、それを使用してプロパティタイプを記述できます。
TypeScriptとReact Router V 4.0を使用している場合、構文は異なります。ルートは次のように宣言します。
<Route path="/home/:topic?" render={() => {
return this.renderView(<ContentHolder />);
}} />
次に、コンポーネントは次のように宣言されます。
interface RouteInfo {
topic: string;
}
interface ComponentProps extends RouteComponentProps<RouteInfo> {
}
class ContentHolder extends Component<ComponentProps> {
render() {
return (
<Content>
<h1 className="page-title">{this.props.match.params.topic}</h1>
</Content>
);
};
};
export default withRouter(ContentHolder);
次に、this.props.match.params
VS CodeとIntelliJの両方でIntelliSenseを完全に利用できます