【问题标题】:how can I put a React component in a typescript interface?如何将 React 组件放入打字稿界面?
【发布时间】:2020-09-06 09:45:21
【问题描述】:

如果我将“组件”的类型定义为任何类型,则可以:

import React from 'react';
import { Redirect, Route } from 'react-router-dom';
import { WEB_APP_TOKEN_KEY } from './auth.api';


export interface IAuthRouteProps {
    component: any // React.Component
    path: string
}

const AuthRoute: React.FC<IAuthRouteProps> = (props) => {

    if (!localStorage.getItem(WEB_APP_TOKEN_KEY)) {
        return <Redirect to="/login" />;
    }

    return <Route component={props.component} path={props.path} />;
};

export default AuthRoute;

这就是它的使用方式

 <Switch>
          <Route exact path="/" component={MainPage}/>
          <AuthRoute path="/cars" component={CarPage}/>
 </Switch>

在界面中,我想输入项目“componenten”而不是“any”,而是作为 React 组件。这可能吗?

【问题讨论】:

  • React.ComponentType?
  • 哇完美。我的请求仍然很热情并且已经解决。非常感谢。

标签: reactjs typescript interface


【解决方案1】:

只需像声明具有所有需要的道具的功能组件一样声明它:

export interface IAuthRouteProps {
    component: React.FC<MainPageProps | CarPageProps>
    path: string
}

如果您不想如此精确地确定所需的组件类型(MainPageCarPage),只需使用不带泛型声明的 React.FC

【讨论】:

  • 您可能不想将自己局限于功能组件。
  • 如果他只使用功能组件那完全没问题,如果他使用全局React.ComponentType 那就更糟糕了:/ 最好尽可能精确。
  • 通过 React.FC 将所有允许的组件包含在枚举中甚至更好。谢谢你。
  • 嗯,但它不太准确。如果只有MainPageCarPage 应该进行身份验证,那么最好这样声明它们。所以你确定除了MainPageCarPage 之外没有其他组件会在prop 中传递。
  • 我刚试过这个,意识到我误解了它。如何定义 CarPageProps?
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2021-09-08
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
相关资源
最近更新 更多