【问题标题】:How to make a functional React component with generic type?如何制作具有泛型类型的功能性 React 组件?
【发布时间】:2025-04-27 05:45:01
【问题描述】:

我正在尝试制作一个接收泛型类型参数的 React 组件,该类型参数将成为其 prop 类型的一部分。

我想要一个看起来像这样的解决方案:

interface TestProps<T> {
  value: T;
  onChange: (newValue: T) => void;
}

const Test: React.FC<TestProps<T>> = (props) => (
  <span>{props.value}</span>
);

我已经看到 TypeScript 2.9 对此提供了支持,而我正在使用 4.3.5。

它的用法如下所示:

const Usage: React.FC = () => (
  <div>
    <Test<Obj>
      value={{ name: 'test' }}
      onChange={(newValue) => {
        console.log(newValue.name);
      }}
    />
  </div>
);

代码沙箱:https://codesandbox.io/s/react-typescript-playground-forked-8hu13?file=/src/index.tsx

【问题讨论】:

标签: reactjs typescript typescript-generics tsx


【解决方案1】:

最简单的方法是使泛型 FC 成为常规函数,而不是箭头函数。 (React.PropsWithChildren&lt;&gt; 模拟 React.FC 对您的 props 类型所做的事情。)

function Test<T>(props: React.PropsWithChildren<TestProps<T>>) {
    return <span>Some component logic</span>;
}

【讨论】:

    【解决方案2】:

    你需要用这种方式重写你的Test组件

    const Test= <T,>(props:TestProps<T>) => (
        <span>Some component logic</span>
    );
    

    你能用 React.FC 做同样的事情吗? FC是不可能的。

    这是FC 实现:

    interface FunctionComponent<P = {}> {
      (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
      // ... other static properties
    }
    

    您可能已经注意到,FC 是一种函数类型,而不是道具类型。

    更新

    你可以创建高阶函数,但我不确定它是否值得

    const WithGeneric = <T,>(): React.FC<TestProps<T>> =>
      (props: TestProps<T>) => (
        <span>Some component logic</span>
      );
    const Test = WithGeneric<Obj>()
    

    【讨论】:

    • 你能用React.FC&lt;TestProps&lt;T&gt;&gt;显示同样的内容吗?
    • 进行了更新。 FC是不可能的
    • 是的,FC 是一种函数类型,但我的问题是,您能否展示一种语法,允许使用 React.FC 注释通用箭头函数,以便应用相同的类型(修改的道具,带注释的返回类型,可能的静态添加)。
    • 我更新了。您可以将组件包装在高阶函数中。值得使用value 参数来推断T 而不是没有值的显式泛型参数,但这取决于你
    最近更新 更多