TypeScript 和 React:在 props 中传递组件并从函数返回它

J. *_*ers 3 typescript reactjs typescript-typings typescript-types react-props

我正在用 React 和 TypeScript 编写一个 Form 组件。我将 Formik 用于表单逻辑。我想将<Form />组件作为道具传递给特定的表单并进行渲染。这是我尝试过的:

import { Formik, FormikProps } from "formik";
import React, { PureComponent, ReactNode } from "react";

export interface Props {
  component: ReactNode; // TODO: Change to one of LoginForm or RegisterForm.
  handleSubmit(): void;
}

export class Form extends PureComponent<Props> {
  renderForm = (formikProps: FormikProps<any>): ReactNode => {
    const { component: FormComponent } = this.props;
    return <FormComponent {...formikProps} />;
  };

  render() {
    const { handleSubmit } = this.props;
    return <Formik render={this.renderForm} />;
  }
}

export default Form;
Run Code Online (Sandbox Code Playgroud)

问题是我返回的那一行<FormComponent />抛出了错误:

[ts] JSX element type 'FormComponent' does not have any construct or call signatures.
Run Code Online (Sandbox Code Playgroud)

renderForm必须返回一个 ReactNode,所以我不能更改ReactNodeComponentType(后者将解决 JSX 错误)。

如何在 TypeScript 中做到这一点?

编辑 所以我通过这样做让它工作(感谢estus):

import { Formik, FormikProps } from "formik";
import React, { PureComponent, ReactElement } from "react";

export interface Props {
  component: React.ComponentType<any>; // TODO: Change to one of LoginForm or RegisterForm.
  handleSubmit(): void;
}

export class Form extends PureComponent<Props> {
  renderForm = (formikProps: FormikProps<any>): ReactElement<any> => {
    const { component: FormComponent } = this.props;
    return <FormComponent {...formikProps} />;
  };

  render() {
    const { handleSubmit } = this.props;
    return <Formik render={this.renderForm} />;
  }
}

export default Form;
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 11

ReactNode是 React元素类型,而componentprop 应该是 React组件

应该是:

export interface Props {
  component: React.ComponentType;
  handleSubmit(): void;
}
Run Code Online (Sandbox Code Playgroud)

renderForm 必须返回一个 ReactNode,所以我不能将 ReactNode 更改为 ComponentType(后者将解决 JSX 错误)。

componentprop 和renderFormreturn 类型没有连接。前者是一个组件,后者是一个元素。