React.ComponentType 类型使用

React.ComponentType 是 React 在 TypeScript 类型定义中的一个通用组件类型类型别名 ,它的作用是用来表示任何合法的 React 组件类型(无论是函数组件还是类组件)。

1. 定义

在 React 的类型声明文件(@types/react)中,ComponentType 是这样定义的:

ts 复制代码
type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>;

也就是说:

  • P 代表组件的 props 类型(默认为 {})。
  • React.ComponentType<P>React.ComponentClass<P>React.FunctionComponent<P> 的联合类型。 因此它既可以表示:
  • 函数组件
  • 类组件

2. 使用场景

(1)作为泛型参数接收一个不限定组件类型的参数

当你想写一个高阶组件 (HOC) ,但它既能接收函数组件也能接收类组件时,可以用 ComponentType 来表示传入的组件类型:

ts 复制代码
import React from 'react';

function withTitle<P>(Component: React.ComponentType<P>) {
  return (props: P) => {
    return (
      <div>
        <h1>标题</h1>
        <Component {...props} />
      </div>
    );
  };
}

这里的 Component 可能是:

ts 复制代码
const Hello: React.FC<{ name: string }> = ({ name }) => <div>Hello {name}</div>;
class World extends React.Component<{ name: string }> {
  render() {
    return <div>World {this.props.name}</div>;
  }
}

const HelloWithTitle = withTitle(Hello);
const WorldWithTitle = withTitle(World);

2)做组件工厂或动态渲染

如果你需要一个函数来接收一个组件类型并进行动态渲染,可以用 ComponentType 做参数类型:

ts 复制代码
function renderComponent<P>(Component: React.ComponentType<P>, props: P) {
  return <Component {...props} />;
}

用法:

ts 复制代码
renderComponent(Hello, { name: 'Alice' });
renderComponent(World, { name: 'Bob' });

3. 对比其他类型

类型 说明 使用场景
React.FC<P> 仅能表示函数组件 适合明确组件就是函数组件
React.ComponentClass<P> 仅能表示类组件 适合明确组件就是类组件
React.ComponentType<P> 同时表示类组件和函数组件(FCComponentClass 的联合类型) 想写通用的组件接收器(如 HOC)时

总结React.ComponentType<P> 用于表示 "任意类型的 React 组件" (泛化到函数组件 + 类组件),尤其适合在 高阶组件(HOC)组件工厂动态组件渲染 等需要支持多种组件写法的场景中使用。

相关推荐
寅时码20 小时前
React 之死·终章:一个 useRef,把闭包陷阱、依赖数组、漫天 rerender 全送走
前端·react.js·ai编程
不好听61320 小时前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
wordbaby20 小时前
为什么刷新页面就 404?聊聊 SPA 路由与 Nginx 的那点事
前端
不好听61320 小时前
React 核心概念:JSX、组件与数据驱动
前端·react.js
触底反弹20 小时前
🔥 React 零基础入门(中):500 行屎山代码到组件化的蜕变
前端·javascript·react.js
不好听61320 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
GuWenyue20 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue20 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
小林ixn21 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn1 天前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端