TypeScript и React: передать компонент в props и вернуть его из функции

Я пишу компонент формы с помощью React и TypeScript. Я использую 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;

Проблема в том, что строка, в которой я возвращаю <FormComponent />, выдает ошибку:

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

renderForm должен возвращать ReactNode, поэтому я не могу изменить ReactNode на ComponentType (последний разрешит ошибку JSX).

Как это сделать в TypeScript?

Редактировать Итак, я заставил это работать, выполнив это (спасибо эстус):

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;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
9 619
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ReactNode относится к типу React элемент, а свойство component - к типу React компонент.

Вероятно, это должно быть:

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 и возвращаемый тип renderForm не связаны. Первый - это компонент, а второй - элемент.

Привет, Эстус, спасибо, что снова помогли мне ? Я отредактировал сообщение после вашего ответа, мне просто интересно, это ли вы имели в виду в своем ответе?

J. Hesters 13.11.2018 22:26

Другие вопросы по теме