You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义ProtectedRoute组件类型标注问题:移除any后编译报错

问题解决:ProtectedRoute组件类型错误修复

错误原因

你的组件编译报错的核心问题是:React组件作为JSX使用时,返回类型必须严格为JSX.Element | null,而当前代码中props.children的类型是ReactNode——这个类型包含了字符串、数字、undefined等非有效JSX元素类型,导致组件整体返回类型不符合JSX组件的要求,从而抛出TS2786错误。

解决方案

1. 限制子元素类型

将Props中children的类型从宽泛的ReactNode改为严格的ReactElement或ReactElement[](路由组件的子元素通常是页面级组件,属于有效JSX元素)。

2. 明确组件返回类型

给组件指定返回类型为JSX.Element | null,确保返回值符合JSX组件要求。

修改后的完整代码

import { ReactElement } from 'react';
import { useSelector, shallowEqual } from 'react-redux';

// 假设getLoginStatus和NotLogged已正确定义
interface Props {
    children: ReactElement | ReactElement[];
}

export const ProtectedRoute = (props: Props): JSX.Element | null => {
    const isLogged = useSelector(getLoginStatus, shallowEqual);

    if (!isLogged) {
        return <NotLogged />;
    }

    return props.children;
};

为什么之前的尝试无效?

  • 使用JSX.Element:因为children是ReactNode类型,组件返回类型会变成JSX.Element | ReactNode,仍包含无效类型,无法通过编译。
  • 使用ReactNode:该类型包含undefined、字符串等非JSX元素类型,不符合React组件作为JSX使用的返回值要求。
  • 使用()=>JSX.Element:这是函数类型,而你返回的是组件实例(<NotLogged />),类型不匹配。

内容的提问来源于stack exchange,提问作者Kiszuriwalilibori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:58:14