reactjs - 如何为作为道具传入的 React 组件设置类型
问题描述
我有以下代码,我在其中渲染组件或根据身份验证状态重定向用户。我无法理解应该在我声明的界面中设置的组件道具类型:
import { useState } from 'react';
import { Redirect, Route } from 'react-router-dom';
import { useAuthState } from '../../../context/authenticationContext';
interface AppProps {
path: string,
isPrivate: boolean,
}
const AppRoutes = ({ component: Component, path, isPrivate, ...rest }: AppProps) => {
const authDetails = useAuthState();
...
return (
<Route
path={path}
render={props => (isPrivate && !authDetails.user) ? (
<Redirect
to={{ pathname: "/" }}
/>
) : (
<Component {...props} />
)
}
{...rest}
/>
)
}
export default AppRoutes
如您所见,我的界面缺少组件类型。不确定将其设置为什么。
解决方案
如果要键入组件构造函数,则应使用import {ComponentType} from 'react'
.
因此,如果您想使用函数Component
中的道具进行构建render
,您应该对ComponentTypeProps
.
换句话说,您Component
应该期望Route['render']
参数类型。为了获得render
参数的类型,您应该使用ComponentProps
实用程序,您可以从“react”导入。
考虑这个例子:
type RenderProps = Parameters<NonNullable<ComponentProps<typeof Route>['render']>>[0]
现在您可以使用适当的约束:
import React, { ComponentType, ComponentProps } from 'react';
import { Route } from 'react-router-dom';
interface AppProps {
path: string,
isPrivate: boolean,
Component: ComponentType<RenderProps>
}
type RenderProps = Parameters<NonNullable<ComponentProps<typeof Route>['render']>>[0]
const AppRoutes = ({ Component, path, isPrivate, ...rest }: AppProps) => {
return (
<Route
path={path}
render={props => <Component {...props} />}
{...rest}
/>
)
}
export default AppRoutes
推荐阅读
- go - 函数退出后,goroutine如何从调用函数访问局部变量?
- java - ViewModel Observer 显示空 RecyclerView
- amazon-web-services - boto3 对象是否有通用的“描述”方法?
- javascript - 在nodejs中处理大文件和节点以及内存限制
- amazon-web-services - 转储和评估 S3 存储桶策略的最佳方法
- python - 无法通过 python 请求从我的本地计算机连接到 Lambda 或 EC2
- rxjs - 内部可观察对象未更新
- react-navigation - 如何从 React Navigation v5 的组件中获取屏幕选项?
- javascript - 使用 Javascript/Regex 从文本文档中提取值
- python-3.x - Pandas:在聚合函数中获取 abs() mean()