TypeScript 结合 React 开发时候 , React.FunctionComponent 解释

在 TypeScript 结合 React 开发时,React.FC(或 React.FunctionComponent)是一个泛型类型,它用于定义函数组件的类型。这个类型定义了函数组件的结构和预期行为,并且提供了泛型支持,以便你可以指定组件 props 的类型。

React.FC 做了以下几件事情:

  1. 定义 Props 类型 :

    通过泛型参数,React.FC 允许你指定 props 的类型。例如:

    tsx 复制代码
    type MyComponentProps = {
      message: string;
    };
    
    const MyComponent: React.FC<MyComponentProps> = ({ message }) => {
      return <div>{message}</div>;
    };

    在这个例子中,MyComponent 的 props 类型被定义为 MyComponentProps

  2. 隐含 children :
    React.FC 隐式地给组件的 props 类型添加了 children 属性,这意味着你可以在组件中使用 props.children 而不需要在你的类型定义中显式声明它。

    tsx 复制代码
    const MyComponent: React.FC<MyComponentProps> = ({ children }) => {
      return <div>{children}</div>;
    };

    在这个例子中,即使 MyComponentProps 没有定义 children 属性,你也可以使用它,因为 React.FC 已经包含了它。

  3. 返回类型 :
    React.FC 类型也隐式地定义了组件的返回类型,这意味着你的组件返回的必须是一个 React 元素或者 null

  4. PropTypes 和 defaultProps :
    React.FC 类型还提供了对 propTypesdefaultProps 的支持。虽然在 TypeScript 中,propTypes 不如类型定义那么常用,但 defaultProps 的支持可以让你为 props 设置默认值。

    tsx 复制代码
    const MyComponent: React.FC<MyComponentProps> = ({ message = "Hello" }) => {
      return <div>{message}</div>;
    };

    在这个例子中,如果没有提供 message prop,它会默认为 "Hello"。

然而,使用 React.FC 并不是没有争议的。有一些原因导致一些开发者选择不使用 React.FC

  • 显式与隐式 :

    一些开发者更喜欢显式地声明 children,以便更清楚地了解组件的 props 结构。

  • defaultProps 的行为 :

    在使用泛型和默认 props 的情况下,defaultProps 有时会与 TypeScript 的类型推断发生冲突。

  • 组件返回类型 :

    当你不希望组件返回 null 时,使用 React.FC 可能会让类型检查变得不那么严格。

因此,是否使用 React.FC 取决于你的个人或团队的偏好。一些团队可能会选择不使用 React.FC 并直接声明函数的类型,例如:

tsx 复制代码
type MyComponentProps = {
  message: string;
  children?: React.ReactNode; // 显式地声明 children
};

const MyComponent = ({ message, children }: MyComponentProps) => {
  return <div>{message}{children}</div>;
};

在这种方式中,你完全控制了组件的 props 类型定义,并且避免了 React.FC 可能引入的任何隐式行为。

相关推荐
恋猫de小郭24 分钟前
Redis 作者反驳「中国模型之所以强,是因为通过 API 蒸馏了美国模型」
前端·人工智能·ai编程
Darling噜啦啦28 分钟前
Canvas 游戏开发与数据可视化实战:从飞机大战到 ECharts 报表
前端·echarts·canvas
OpenTiny社区39 分钟前
这次更新太良心!GenUI SDK v1.2.0 轻量化 + 稳流式 + 超强 Playground
前端·vue.js·ai编程
梨子同志39 分钟前
WebGL test
前端
m0_5474866640 分钟前
《HTML+CSS+JavaScript+Vue前端开发技术教程》全套PPT课件
javascript·css·html
程序员黑豆41 分钟前
AI全栈开发系列开篇:从Java全栈到AI应用实战
前端·ai编程·全栈
yangyj44 分钟前
从 PDR 到落地:用 Codex 完成一次 Rspack 升级
前端
程序员鱼皮44 分钟前
提示词工程已死,Loop Engineering 称王!保姆级教程 + 项目实战
前端·后端·ai编程
FliPPeDround1 小时前
告别离线 Agent:deepseek-kit 内置 Web Search,零配置联网搜索
javascript·agent·deepseek
小爷毛毛_卓寿杰1 小时前
给 Embedding 模型也加一块“游乐场“—— Xinference 是怎么把 vector 变成肉眼可见的体验的
前端