reactjs - typescript 和 react : Pass component in props and return it from a function

标签 reactjs typescript typescript-typings react-props typescript-types

我正在使用 React 和 TypeScript 编写一个表单组件。我将 Formik 用于表单逻辑。我想通过 <Form />组件一个特定的形式作为 Prop 并渲染它。这是我尝试过的:

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;

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

[ts] JSX element type 'FormComponent' does not have any construct or call signatures.

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;

最佳答案

ReactNode 是 React element 类型,而 component prop 应该是 React component

它可能应该是:

export interface Props {
  component: React.ComponentType;
  handleSubmit(): void;
}

renderForm has to return a ReactNode, so I can't change ReactNode to ComponentType (the latter would resolve the JSX error).

component prop 和 renderForm 返回类型没有关联。前者是组件,后者是元素。

关于reactjs - typescript 和 react : Pass component in props and return it from a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289525/

相关文章:

javascript - 时刻JS ("Must to show days in next week")

reactjs - 如何解决: "Definition for rule ' @typescript-eslint/consistent-type-assertions' was not found"

reactjs - 如何在react-router-dom v6中的事件NavLink中显示不同的图标?

reactjs - 如何强制从 mapStateToProps 内部进行更新?

node.js - 使用依赖注入(inject)在 Typescript 中进行单元测试

angularjs - 使用@types/angular 作为全局

typescript - 如何防止重复的自动建议导入

javascript - 在 React 中创建滚动位置指示器

javascript - 在 React.js 中渲染 HTML 时没有额外的 "data-reactid"DOM 属性?

typescript - react Redux TS : TypeScript complains about a connect() call