【发布时间】:2020-12-07 08:04:28
【问题描述】:
我正在使用来自 React Router v4 的 Route 组件的渲染道具,使用 Typescript 和 React 实现 Authenticated Routes。
路线:
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import { ROUTES } from 'utils/constants';
import HomePage from 'components/pages/Home';
import GuestLogin from 'components/pages/GuestLogin';
import ProfilePage from 'components/pages/Profile';
import NotFoundPage from 'components/pages/NotFound';
import ResetPassword from 'components/pages/ResetPassword';
import SetPassword from 'components/pages/SetPassword';
import LoginContainer from 'containers/Login';
import PrivateRoute from './PrivateRoute';
const Routes: React.FunctionComponent = () => (
<Switch>
<Route path={ROUTES.LOGIN} component={LoginContainer} exact></Route>
<PrivateRoute
path={ROUTES.HOME}
component={HomePage}
></PrivateRoute>
<Route path={ROUTES.GUEST_LOGIN} component={GuestLogin}></Route>
<Route path={ROUTES.RESET_PASSWORD} component={ResetPassword}></Route>
<Route path={ROUTES.SET_PASSWORD} component={SetPassword}></Route>
<Route path={ROUTES.PROFILE} component={ProfilePage}></Route>
<Route component={NotFoundPage}></Route>
</Switch>
);
export default Routes;
私人路线:
import React from 'react';
import { useAppContext } from 'containers/App/AppContext';
import { RouteProps, Route, Redirect } from 'react-router-dom';
import { ROUTES } from 'utils/constants';
const PrivateRoute: React.FunctionComponent<RouteProps> = ({
component: Component,
...routeProps
}) => {
const { isSignedIn } = useAppContext();
const ComponentToRender = Component as React.ElementType;
return (
<Route
{...routeProps}
render={(props) =>
isSignedIn ? (
<ComponentToRender {...props} />
) : (
<Redirect to={ROUTES.LOGIN} />
)
}
/>
);
};
export default PrivateRoute;
问题是我想调用 props 上的 Component 集,但是,每次我尝试这个时,Typescript 都会抛出以下错误。
JSX element type 'Component' does not have any construct or call signatures. TS2604
原因似乎是 Route 的组件类型不是 Typescript 所期望的,如下所述:https://github.com/microsoft/TypeScript/issues/28631,因此我刚刚创建了一个具有新类型(ComponentToRender)的副本。
有没有更好的方法来实现这一点?也许覆盖 RouteProps 组件元素?
谢谢!
【问题讨论】:
-
您使用的是
react和@types/react的哪个版本? -
嗨,我正在使用
React 16.13.1和@types/react 16.9.41。 -
由于我没有看到您的代码有任何问题,所以您能否分享您的堆栈跟踪,以显示错误来自何处?
-
我用实际错误的图片更新了帖子。
-
别担心,如果我没有找到解决方案,我稍后会添加一个简单的 repo。谢谢!
标签: reactjs typescript react-router