Zod

You can find full example at StackBlitz.

Check Zod documentation for more details.

Define a schema:

import z, { object, email, string, boolean } from 'zod' export const exampleSchema = object({ email: email(), name: string().min(1, 'Required'), consent: boolean(), }).superRefine((values, ctx) => { if (!values.consent) { ctx.addIssue({ code: 'custom', path: ['consent'], message: 'Please agree' }) } })

When using TypeScript, infer form values type from the schema:

export type ExampleFormValues = z.infer<typeof exampleSchema>

Connect schema to the form:

import { createForm } from 'solid-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { exampleSchema } from './example_schema' export const ExampleForm = () => { const form = createForm({ defaultValues: { email: '', name: '', consent: false }, resolver: zodResolver(exampleSchema) }) const { errors, register, handleSubmit } = form const onSubmit = (values) => { console.log(values) } return ( <form onSubmit={handleSubmit(onSubmit)}> <input {...register('email')} aria-invalid={Boolean(errors.email)} /> {errors.email && <p role="alert">{errors.email.message}</p>} <input {...register('name')} aria-invalid={Boolean(errors.name)} /> {errors.name && <p role="alert">{errors.name.message}</p>} <input type="checkbox" {...register('consent')} aria-invalid={Boolean(errors.consent)} /> {errors.consent && <p role="alert">{errors.consent.message}</p>} <button type="submit">Save</button> </form> ) }