reactjs - TypeScript React 中可重用的布局组件 : Property 'path' does not exist on type 'IntrinsicAttributes & IProps'

标签 reactjs typescript react-router

我正在使用 TypeScript React 和 React Router v5 编写一个可重用的全角布局组件。我希望这个组件能够应用于我网站上的多个不相关的页面。

我尝试为我的布局组件创建一个自定义路由,该组件的 props 扩展了 RouteComponentPropsRoute,但在这两种情况下都出现以下错误:

类型“IntrinsicAttributes & IProps”上不存在属性“path”。 TS2322

我猜这是因为 TypeScript 无法识别我的自定义路由与 React Router 使用的路由不同,因此它找不到 path 属性。

如何让我的布局组件用作路线?

全角布局.tsx:

import React, { Component, ComponentType } from 'react';
import { Route, RouteComponentProps } from 'react-router-dom';

export const FullWidthLayout = ({ children }: any) => (
    <div>
        {children}
    </div>
)

interface IProps extends RouteComponentProps {
    component: ComponentType
}

export const FullWidthLayoutRoute = ({ component, ...rest }: IProps) => {
    return (
        <Route {...rest} render={matchProps => (
            <FullWidthLayout>
                <Component {...matchProps} />
            </FullWidthLayout>
        )} />
    )
}

export default FullWidthLayout;

应用程序.tsx:

import React, { Component } from "react";
import { Switch } from "react-router-dom";
import "./App.scss";
import Breadcrumbs from "./breadcrumbs/breadcrumbs";
import Footer from "./footer/footer";
import { MaintainCart } from "./helpers/maintain-cart";
import Home from "./home";
import { FullWidthLayoutRoute } from "./layouts/full-width-layout";
import Menu from "./menu";
import { CartProvider } from "./shopping-cart/shopping-cart-context";


class App extends Component {
    render() {
        return (
            <CartProvider>
                <div>
                    <Menu />

                    <Breadcrumbs />

                    <MaintainCart />

                    <Switch>
                        <FullWidthLayoutRoute path="/" component={Home} />
                    </Switch>

                    <Footer />
                </div>
            </CartProvider>
        );
    }
}

export default App;

index.tsx:

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import "./main.css";
import "./bootstrap.min.css";
import "./responsive.css";
import App from "./App";
import { BrowserRouter as Router } from "react-router-dom";
import * as serviceWorker from "./serviceWorker";
import * as dotenv from 'dotenv'
import ScrollToTop from "./common/scroll-to-top";


dotenv.config()

ReactDOM.render(
  <Router basename='/rap'>
    <ScrollToTop />
    <App />
  </Router>,
  document.getElementById("root")
);

serviceWorker.unregister();

最佳答案

问题是由于扩展了错误的接口(interface)RouteComponentProps。正确的应该是 RouteProps ,以便您的代码应按如下所示进行改进:

import React, { Component, ComponentType } from 'react';
import { Route, RouteProps } from 'react-router-dom';

export const FullWidthLayout = ({ children }: any) => (
  // ...
)

// Replace with `RouteProps`
interface IProps extends RouteProps {
    // should also specify for props here
    // if you have no idea how just leave it as any
    component: ComponentType<any>
}

// Looks like you're using a base component class `Component` in the original code
// so I replace `component` as `Comp` for you
export const FullWidthLayoutRoute = ({ component: Comp, ...rest }: IProps) => {
    return (
        <Route {...rest} render={matchProps => (
            <FullWidthLayout>
                <Comp {...matchProps} />
            </FullWidthLayout>
        )} />
    )
}

关于reactjs - TypeScript React 中可重用的布局组件 : Property 'path' does not exist on type 'IntrinsicAttributes & IProps' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66029824/

相关文章:

javascript - GoJS 的 NodeData 和 LinkData 属性字段是什么?

reactjs - 路由到嵌套路径 v6 reactjs 时如何隐藏父组件?

stream - 流如何适合 Flux 应用程序?

javascript - Webpack 找不到 jsx 文件

javascript - 函数式编程: How to convert an impure function to a pure function when the input needs to be mutated

javascript - React & React-router 异步组件挂载多次(多次调用componentDidMount)

reactjs - 无法读取未定义的属性(读取 'path')

javascript - 在运行时检测生产与开发 React

javascript - 如何使用 react 和样式组件制作 Accordion 菜单

html - 如何访问 Angular2 中的 HTML 视频元素