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

React.memo结合TypeScript实现复合组件模式报错解决方案

React.memo 结合复合组件的 TypeScript 类型错误解决方法

错误原因

React.memo 返回的 NamedExoticComponent 实例初始状态下并不包含你定义的 Child 属性,但你声明的联合类型 NamedExoticComponent<SearchCardProps> & ParentComposition 要求必须存在该属性,因此 TypeScript 会抛出属性缺失的错误。

解决方案

方案一:先创建 memo 组件,挂载子组件后再断言类型

interface ParentComposition {
    Child: typeof SearchCardChild;
}

interface SearchCardProps {}

// 先定义子组件
const SearchCardChild: React.FC = () => {
    return <div>Child Component</div>;
};

// 创建 memo 化的父组件,暂不指定完整类型
const MemoizedSearchCard = React.memo(({}: SearchCardProps) => {
    return <div>Parent Component</div>;
});

// 挂载子组件到父组件上
MemoizedSearchCard.Child = SearchCardChild;

// 断言为目标联合类型并导出
export const SearchCard = MemoizedSearchCard as NamedExoticComponent<SearchCardProps> & ParentComposition;

方案二:直接断言类型后挂载子组件

interface ParentComposition {
    Child: typeof SearchCardChild;
}

interface SearchCardProps {}

const SearchCardChild: React.FC = () => {
    return <div>Child Component</div>;
};

// 创建 memo 组件并直接断言为目标类型
export const SearchCard = React.memo(({}: SearchCardProps) => {
    return <div>Parent Component</div>;
}) as NamedExoticComponent<SearchCardProps> & ParentComposition;

// 挂载子组件
SearchCard.Child = SearchCardChild;

方案三:用 Object.assign 合并组件与子组件(自动推断类型)

这种方式无需手动声明联合类型,TypeScript 会自动识别合并后的组件类型:

interface SearchCardProps {}

const SearchCardChild: React.FC = () => {
    return <div>Child Component</div>;
};

const MemoizedSearchCard = React.memo(({}: SearchCardProps) => {
    return <div>Parent Component</div>;
});

// 合并 memo 组件与子组件,自动推断包含 Child 的类型
export const SearchCard = Object.assign(MemoizedSearchCard, {
    Child: SearchCardChild
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:54:11