import { ReactNode, DetailedHTMLProps, FormHTMLAttributes } from "react";
import {
FieldValues,
SubmitHandler,
useForm,
UseFormReturn,
} from "react-hook-form";
// I want to add this type to the FormProps interface
// DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>
interface FormProps<TFormValues extends FieldValues> {
onSubmit: SubmitHandler<TFormValues>;
children: (methods: UseFormReturn<TFormValues>) => ReactNode;
}
export const Form = <TFormValues extends Record<string, any>>({
onSubmit,
children,
}: FormProps<TFormValues>) => {
const methods = useForm<TFormValues>();
return (
<form onSubmit = {methods.handleSubmit(onSubmit)}>{children(methods)}</form>
);
};
Я пытаюсь добавить тип данных DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement> для формы, не уверен, что это правильный способ сделать это.





Используйте extends, чтобы сказать, что интерфейс FormProps состоит из того же содержимого, что и желаемый тип, а также из дополнительных свойств, которые вы указываете.
Убедитесь, что имена свойств не конфликтуют, или, если вы делаете это намеренно, конфликтующие свойства должны иметь совместимые типы. В вашем случае onSubmit и children сталкиваются со свойствами в DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement> и имеют несовместимые типы; вместо этого вы можете просто использовать другие имена.
interface FormProps<TFormValues extends FieldValues> extends
DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement> {
// Make sure not to collide properties with incompatible types
submitHandler: SubmitHandler<TFormValues>;
methodsHandler: (methods: UseFormReturn<TFormValues>) => ReactNode;
}
export const Form = <TFormValues extends Record<string, any>>({
submitHandler,
methodsHandler,
...formAttrs
}: FormProps<TFormValues>) => {
const methods = useForm<TFormValues>();
return (
<form onSubmit = {methods.handleSubmit(submitHandler)} {...formAttrs}>{methodsHandler(methods)}</form>
);
};