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

TypeScript如何合并支持HTML元素与组件的React GetProps泛型类型

解决方案

实现代码

import type { Component, ComponentPropsWithoutRef, ElementType } from 'react';

export type GetProps<T> = 
  // 匹配HTML标签字符串、函数组件、类组件构造函数的场景
  T extends ElementType ? ComponentPropsWithoutRef<T>
  // 匹配传入类组件实例类型的场景
  : T extends Component ? ComponentPropsWithoutRef<new () => T>
  // 不符合上述两种情况返回never兜底
  : never;

逻辑说明

  • 第一层条件判断会匹配所有React原生支持的元素类型,包括div/span这类HTML标签字符串、函数组件、类组件构造函数,直接调用内置的ComponentPropsWithoutRef获取对应Props类型,覆盖原有GetProps<'div'>的用法。
  • 第二层条件判断专门适配传入类组件实例类型的场景,先将实例类型转换为对应的构造函数类型再提取Props,覆盖原有GetProps2<Component>的用法。
  • 该实现还额外支持直接传入函数组件类型获取Props的场景,兼容性更强。

用法示例

// 1. 传入HTML标签
type DivProps = GetProps<'div'> 
// 等价于 React.HTMLAttributes<HTMLDivElement>

// 2. 传入类组件实例类型
class MyClassComp extends Component<{ id: number; name: string }> {}
type MyClassCompProps = GetProps<MyClassComp> 
// 提取结果:{ id: number; name: string }

// 3. 额外支持传入函数组件类型
const MyFuncComp = (props: { age: number; sex?: 'male' | 'female' }) => <div />
type MyFuncCompProps = GetProps<typeof MyFuncComp>
// 提取结果:{ age: number; sex?: 'male' | 'female' }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:24:02