Skip to content

zod

useZodForm

javascript

import { zodResolver } from '@hookform/resolvers/zod';
import { useForm } from 'react-hook-form';

import type { UseFormProps } from 'react-hook-form';
import type { ZodSchema, TypeOf } from 'zod';

const useZodForm = <T extends ZodSchema<any>>({
	schema,
	...formConfig
}: UseZodFormProps<T>) =>
	useForm({
		...formConfig,
		resolver: zodResolver(schema),
	});
javascript
import { useZodForm } from '~/hooks/useZodForm';
import type { TypeOf } from 'zod';

const argsSchema = z.object({
	params: z.optional(z.array(z.string().trim().min(1))),
	types: z.optional(z.array(z.string().trim().min(1))),
});

const { handleSubmit, formState, register, control } = useZodForm({
  schema: argsSchema,
});

const formTypeInputs = useWatch({ control, name: 'types' });

Comparison

javascript
import * as z from 'zod';

const userSchema = z.object({
  username: z.string().min(3),
  email: z.string().email(),
});

const userData = {
  username: 'john_doe',
  email: 'john@example.com',
};

const result = userSchema.safeParse(userData);

if (result.success) {
  console.log('Data is valid:', result.data);
} else {
  console.log('Data is invalid:', result.error);
}

Zod 还提供了许多其他功能,例如自定义错误消息、异步验证和类型推断

type infer

javascript
// all properties are required by default
const Dog = z.object({
  name: z.string(),
  age: z.number(),
});

// extract the inferred type like this
type Dog = z.infer<typeof Dog>;

// equivalent to:
type Dog = {
  name: string;
  age: number;
};

更新: 2023-07-31 15:56:12
原文: https://www.yuque.com/u3641/dxlfpu/lmaf5lmhhdxkugbn