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

如何在TypeScript中扩展React函数式组件?

解决方案

你需要借助TypeScript工具类型和React内置的类型提取能力,自动推导包装组件的Props类型,同时保证对原组件类型变化的兼容性:

步骤1:提取并调整原组件的Props类型

使用React.ComponentProps提取TsCode的所有属性类型,再通过Omit工具类型移除你要固定的pretty属性——这样用户使用PrettyTsCode时就无需再传入pretty参数:

import { ComponentProps } from 'react';

// 提取TsCode的Props,排除固定的pretty属性
type PrettyTsCodeProps = Omit<ComponentProps<typeof TsCode>, 'pretty'>;

如果TsCode支持ref传递,可改用ComponentPropsWithRef保留ref相关类型;若无需传递ref,用ComponentPropsWithoutRef会更严谨。

步骤2:定义包装组件

将组件的props类型指定为上面定义的PrettyTsCodeProps,内部固定pretty={true}后展开剩余props即可:

const PrettyTsCode = (props: PrettyTsCodeProps) => {
  return <TsCode pretty={true} {...props} />;
};

为什么之前的方式不生效?

  • const PrettyTsCode: TsCode:TsCode是组件实例的类型,并非组件本身的类型,二者类型不匹配。
  • const PrettyTsCode: typeof TsCode:typeof TsCode是原组件的完整类型,它要求接收包含pretty的所有props,但我们的包装组件不需要用户传入pretty,因此会触发类型冲突。

这种方案的核心优势是,当TsCode的Props类型未来更新时,PrettyTsCodeProps会自动同步,无需手动维护类型定义,确保了代码的健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:10:25