【问题标题】:How to use Typescript with React Router and match如何将 Typescript 与 React Router 一起使用并进行匹配
【发布时间】:2019-12-30 04:08:38
【问题描述】:

方法

我正在尝试了解 Typescript 和 React Router。我一直在挣扎……

我目前收到错误:

类型“RouteComponentProps'.ts(2339)"`

上不存在属性“params”
import React from "react";
import { RouteComponentProps } from "react-router-dom";

const TopicDetail = ({ match }: { match: RouteComponentProps }) => {
  return (
    <div>
      <h3>{match.params.topicId}</h3>
                 ~~~~~~
    </div>
  );
};

export default TopicDetail;

你看,没有错误!

可以通过定义我自己的interface 来消除错误,但不知何故我觉得这样做是错误的:

import React from "react";

interface Props {
  params: any;
}
const TopicDetail = ({ match }: { match: Props }) => {
  return (
    <div>
      <h3>{match.params.topicId}</h3>
    </div>
  );
};

export default TopicDetail;

【问题讨论】:

    标签: reactjs typescript react-router


    【解决方案1】:

    为路由器参数 props 定义一个接口是推荐的方法,尽管您可以更明确地使用接口声明。当你为你的组件声明 props 的接口时,你可以extend RouteComponentProps 并使用你特定的 params 接口作为类型变量。

    例如:

    import React from "react";
    import { withRouter, RouteComponentProps } from "react-router-dom";
    
    interface RouterProps { // type for `match.params`
        topicId: string; // must be type `string` since value comes from the URL
    }
    
    interface TopicDetailProps extends RouteComponentProps<RouterProps> {
        // any other props (leave empty if none)
    }
    
    const TopicDetail: React.FC<TopicDetailProps> = ({ match }) => {
        return (
            <div>
                <h3>{ match.params.topicId }</h3>
            </div>
        )
    }
    
    export default withRouter(TopicDetail);
    

    【讨论】:

    • 啊,我想我是想一步到位。另外,没有意识到我需要withRouter HOC。最后,我不得不将 topicId 更改为输入 string 以使其工作(不完全确定为什么)。
    • @skube 哦,是的,string 的事情,忘记了...我相信这是因为值来自 url,所以它们都是开始的字符串。
    猜你喜欢
    • 2018-12-30
    • 2020-09-03
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多