React组件类型

React的类型系统与TypeScript一起使用时,提供了安全的应用程序构建.


React.FC 与 React.ElementType

React.FC(React.FunctionComponent)

React.FC 是 React 中专门用于定义函数组件的类型,在 React18 之前,它包含一个隐式的 children prop,这个隐式 children prop 已经在 React18 的类型更改中被删除。

interface SomeComponentProps {
  title: string;
  children?: React.ReactNode;
}

export const SomeComponent: React.Fc<SomeComponentProps> = ({
  title,
  children,
}) => {
  return (
    <div>
      <h1>{title}</h1>
      <div>{children}</div>
    </div>
  );
};

自从删除了隐式 children prop 类型后,现在基本上都是直接将接口分配给 props 对象。

interface SomeComponentProps {
  title: string;
  children?: React.ReactNode;
}

export const SomeComponent = ({ title, children }: SomeComponentProps) => {
  return (
    <div>
      <h1>{title}</h1>
      <div>{children}</div>
    </div>
  );
};

React.ElementType

React.ElementType 是一种更广泛的类型,表示可以由 React 呈现的任何组件类型,不仅包括 React 函数组件和类组件,还包括 HTML 元素的标签(例如“div”),当你想要接受组件作为 prop 并渲染的时候,React.ElementType 特别有用。

const DynamicComponent: React.ElementType = "div";

export const Container = () => (
  <DynamicComponent className="container">Hello,React!</DynamicComponent>
);

这里,DynamicComponent 的类型为 React.ElementType,允许将它动态分配给不同类型的组件或 HTML 元素。

React.FC 主要用于定义功能组件,从React18 开始,可以直接将接口分配给 props 对象 React.ElementType 在接受各种可渲染实体方面提供了更大的灵活性,当你需要可以动态接受不同类型的 React 组件或 HTML 元素的时候使用

React.ReactNode vs React.ReactElement vs JsxEmit.Element

React.ReactElement

React.ReactElement 是一个具有 type、props 和 key 属性的对象,由 React.createElement() 函数创建,与 React.ReactNode 相比,它是一种更具体的类型,表示可以由 React 直接渲染的元素。

const elementContent: React.ReactElement = (
  <div>Hello, React.ReactElement!</div>
);

export const Container = () => <>{elementContent}</>;

React.ReactNode

React.ReactNode 是最具包容性的类型,代表可以由 React 渲染的东西,包括(字符串、数字、布尔值)、JSX.Elements、React.ReactElements 这些类型的数组等等。

const multiElementContent: React.ReactNode = <div>{"这是一个文本节点"}</div>;

const primitiveTypeContent: React.ReactNode =
  "这是一个原始类型的React.ReactNode";

export const Container = () => {
  return (
    <>
      {multiElementContent}
      {primitiveTypeContent}
    </>
  );
};

JSX.Element

JSX.Element 是一个具有更广泛定义的 React.ReactElement,允许各种库以自己的方式实现 JSX,它是 TypeScript 内部使用的类型,用于表示 JSX 表达式的返回类型。

const jsxElement: JSX.Element = <span>Hello, JSX.Element!</span>;

export const Container = () => <>{jsxElement}</>;

React.ReactNode 是最灵活、最具包容性的,适合接受多样化内容的 props React.ReactElement 适用于 React 创建的元素,JSX.Element 适用于 JSX 语法定义的元素