Capítulo 3 de 39
React Hook Form exports a large set of named TypeScript types so every return value, prop, and callback of every hook/component can be typed explicitly (useful for custom wrapper components); TypeScript 4.1+ is required because several types rely on recursive generics for field-path inference.
resolver, and the shape a resolver's .transform() produces (defaults to TFieldValues).(values) => { values, errors } — the type for plugging in Zod/Yup/Joi/etc. instead of built-in rules.handleSubmit's valid/invalid callbacks; FormSubmitHandler is the <Form> component's variant whose payload also carries raw FormData/formDataJson.useForm() — every method (register, control, handleSubmit, watch, subscribe, setValue, setValues, getValues, getErrors, getFieldState, setError, clearErrors, trigger, reset, resetField, resetDefaultValues, unregister, setFocus, formState) has its own named type (UseFormRegister, UseFormWatch, UseFormSetValue, etc.) for typing custom components that receive just one of them as a prop.useForm's validate option — form-level validation that runs alongside or instead of a resolver, returning true, a string (sets errors.form), or a field-keyed object (sets errors.form.<field>).FieldPath<T>, FieldPathByValue<T, V>, FieldValues, FieldArrayWithId — the generic machinery that makes register("firstName") type-check against your form's actual shape.register's validation rules, formState's flags, useForm's mode/reValidateMode, and the keepX flags accepted by reset/unregister.ControllerProps, ControllerRenderProps, ControllerFieldState, UseControllerProps, UseControllerReturn — typing for the Controller component and useController hook.import { useForm, Resolver } from "react-hook-form"
type FormValues = { firstName: string; lastName: string }
const resolver: Resolver<FormValues> = async (values) => ({
values: values.firstName ? values : {},
errors: !values.firstName
? { firstName: { type: "required", message: "This is required." } }
: {},
})
const { register, handleSubmit, formState: { errors } } = useForm<FormValues>({ resolver })
Resolver — the same shape schema-library adapters (@hookform/resolvers/zod, /yup, …) implement.| Type | What it types |
|---|---|
Resolver | external validation function passed to useForm({ resolver }) |
SubmitHandler / SubmitErrorHandler | handleSubmit's valid/invalid callbacks |
UseFormReturn | everything useForm() returns |
UseFormProps | everything useForm(options) accepts |
Control | the control object passed to Controller/useController/useWatch/useFieldArray |
FieldPath<T> | a valid dot-path field name for form values type T |
RegisterOptions | the second argument to register(name, options) |
FormState<T> | shape of formState (errors, isDirty, dirtyFields, touchedFields, isSubmitting, isValid, …) |
UseFieldArrayProps / UseFieldArrayReturn | useFieldArray's options and return (fields, append, remove, replace, …) |
ControllerProps / UseControllerProps | Controller component props / useController hook props |
useForm()'s return value has its own exported type (UseFormRegister, UseFormSetValue, …) — use these to type a component that only receives one method as a prop, instead of the whole UseFormReturn.Resolver<TFieldValues, TContext, TTransformedValues> is the type to implement (or match) when building a custom schema adapter.FieldPath<TFieldValues> is what makes register("someField") reject typos against your form's declared shape.NestedValue is deprecated — don't reach for it in new code.UseFormReturn.UseFieldArrayProps/UseFieldArrayReturn/FieldArrayWithId.RegisterOptions is the validation-rules object type accepted here.