ReactElement的T类型参数是什么?如何在HOC中设置更严格类型?
ReactElement中
T类型参数的含义及你的HOC类型优化 首先明确ReactElement的T类型参数:
从你给出的定义来看,T是string | JSXElementConstructor<any>的子类型,它对应React元素的type属性:
- 当
type是原生HTML/原生RN标签(比如'div'、Text)时,T就是对应的标签字符串或组件构造函数类型 - 当
type是自定义组件(类组件或函数组件)时,T就是该组件本身的构造函数/函数类型
回到你的高阶组件代码,要给ReactElement<Q, ???>填入更严格的类型,直接使用传入的Component参数的类型即可,也就是typeof Component。
修改后的wrapped函数返回类型如下:
function wrapped(props: P, ref: Ref<T>): ReactElement<Q, typeof Component> { // 原有逻辑不变 const componentProps: Q = props as unknown as Q; return <Component {...componentProps} ref={ref} /> }
这个类型的合理性在于:
- 你传入的
Component参数类型是ComponentType<Q>,而ComponentType<Q>本质是JSXElementConstructor<Q>的别名,完全符合ReactElement对T参数的约束(T extends string | JSXElementConstructor<any>) - 使用
typeof Component能让类型系统更精确地追踪元素的type属性,比默认的宽泛约束更严格,同时不会破坏编译
另外你可以优化HOC的泛型调用体验,让Component的类型自动推导,不需要手动传入过多泛型参数,调用时可以简化为:
const HocText = hoc<TextProps, TextProps, Text>(Text);
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

