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





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 не связаны. Первый - это компонент, а второй - элемент.
Привет, Эстус, спасибо, что снова помогли мне ? Я отредактировал сообщение после вашего ответа, мне просто интересно, это ли вы имели в виду в своем ответе?