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

相关推荐
aiwery7 小时前
理解 JavaScript 中的 Iterator、Generator、Promise 与 async/await
前端·面试
K仔7 小时前
什么是DOM事件模型
前端
熊猫片沃子7 小时前
新手必避的 Vue 基础坑:从数据绑定到事件处理的常见错误与解决方案
前端·vue.js
lichenyang4537 小时前
UniApp 实现搜索页逻辑详解
前端
怪可爱的地球人7 小时前
处理“文本搜索和替换” 的工具-RegExp
前端
公众号:重生之成为赛博女保安7 小时前
一款基于selenium的前端验证码绕过爆破工具
前端·selenium·测试工具
漫 漫,7 小时前
Vue2存量项目国际化改造踩坑
前端·javascript·vue.js
喜葵7 小时前
前端测试深度实践:从单元测试到E2E测试的完整测试解决方案
前端·单元测试
web前端1237 小时前
React 状态管理方案对比分析
前端