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

如何在变量中存储任意React.FC?TypeScript类型报错解决

解决React中存储任意函数组件的类型问题

你遇到的问题是因为React.FC默认等价于React.FC<{}>,仅能接受无props的组件,而你的CompoA、CompoB都有自定义props类型,因此类型不兼容。以下是几种无需使用React.FC<any>的解决方案:

方案1:用泛型定义可适配任意props的类型

通过给CompoDefinition添加泛型参数,可以保留组件的props类型信息,同时支持任意函数组件:

import React from 'react';

type CompoDefinition<P = {}> = {
    Compo: React.FC<P>
}

type CompoAProps = {
    a: string
}
function CompoA(props: CompoAProps) {
    return <div>{props.a}</div>
}

type CompoBProps = {
    b: number
}
function CompoB(props: CompoBProps) {
    return <div>{props.b}</div>
}

// 存储CompoA时指定对应的props类型
const F: CompoDefinition<CompoAProps> = {
    Compo: CompoA
}

// 存储CompoB时指定对应的props类型
const G: CompoDefinition<CompoBProps> = {
    Compo: CompoB
}

方案2:用unknown定义通用组件类型

如果不需要保留组件的具体props类型,仅需存储任意函数组件,可以使用React.FC<unknown>(或更通用的React.ComponentType<unknown>,兼容类组件和函数组件)。unknown是TypeScript的安全顶级类型,不会触发代码检查工具的警告,同时比any更安全:

import React from 'react';

// 仅存储任意组件,不关心props类型
type CompoDefinition = {
    Compo: React.FC<unknown>
}

// 或者用ComponentType,支持类组件和函数组件
// type CompoDefinition = {
//     Compo: React.ComponentType<unknown>
// }

const F: CompoDefinition = {
    Compo: CompoA
}

const G: CompoDefinition = {
    Compo: CompoB
}

方案3:存储多个不同组件的集合

如果需要存储一组任意组件,可以结合方案2定义数组类型:

const components: CompoDefinition[] = [
    { Compo: CompoA },
    { Compo: CompoB }
]

注意事项

  • 泛型方案适合需要后续正确传递props的场景,能保留类型校验
  • unknown方案适合仅存储组件、无需直接操作props的场景,兼顾类型安全与灵活性
  • 避免使用any,因为它会绕过TypeScript的类型检查,增加潜在bug风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:10:34