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)组件工厂动态组件渲染 等需要支持多种组件写法的场景中使用。

相关推荐
0思必得023 分钟前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5161 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino1 小时前
图片、文件的预览
前端·javascript
layman05283 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔3 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李3 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN3 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒3 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库3 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052473 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫