You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS+TypeScript中react-hook-form的resolver类型不匹配问题求助

解决React Hook Form + Yup的类型不匹配问题

错误原因

你的IAuthLogin接口包含is_admin字段,但当前的Yup校验Schema和表单默认值仅定义了email和password,导致Resolver推断出的类型只包含这两个字段,与IAuthLogin的结构不匹配,从而触发类型错误。

解决方案

根据is_admin的实际用途,分两种场景处理:

场景1:is_admin是需要用户填写的表单字段

将is_admin补充到Yup Schema和默认值中,确保字段结构与IAuthLogin完全对齐:

import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';

export interface IAuthLogin {
    email: string;
    password: string;
    is_admin: boolean;
}

// 更新Yup Schema,添加is_admin的校验规则
const schema = yup.object().shape({
    email: yup.string().email().required(),
    password: yup.string().min(8).max(32).required(),
    is_admin: yup.boolean().default(false), // 可根据需求设置为required()或可选
});

const { register, handleSubmit, formState } = useForm<IAuthLogin>({
    defaultValues: {
        email: '',
        password: '',
        is_admin: false, // 添加is_admin的初始值
    },
    resolver: yupResolver(schema),
});

场景2:is_admin不是表单字段(提交时额外补充的参数)

此时无需将is_admin纳入表单类型,可通过以下两种方式调整:

方法A:定义表单专属类型
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';

export interface IAuthLogin {
    email: string;
    password: string;
    is_admin: boolean;
}

// 定义仅包含表单字段的类型
interface ILoginFormFields {
    email: string;
    password: string;
}

const schema = yup.object().shape({
    email: yup.string().email().required(),
    password: yup.string().min(8).max(32).required(),
});

const { register, handleSubmit, formState } = useForm<ILoginFormFields>({
    defaultValues: {
        email: '',
        password: '',
    },
    resolver: yupResolver(schema),
});

// 提交时补全is_admin字段
const onSubmit = (formData: ILoginFormFields) => {
    const submitData: IAuthLogin = {
        ...formData,
        is_admin: false, // 根据业务逻辑设置值
    };
    // 执行提交操作
};
方法B:用Omit剔除不需要的字段
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';

export interface IAuthLogin {
    email: string;
    password: string;
    is_admin: boolean;
}

const schema = yup.object().shape({
    email: yup.string().email().required(),
    password: yup.string().min(8).max(32).required(),
});

// 用Omit从IAuthLogin中剔除is_admin字段,作为表单类型
const { register, handleSubmit, formState } = useForm<Omit<IAuthLogin, 'is_admin'>>({
    defaultValues: {
        email: '',
        password: '',
    },
    resolver: yupResolver(schema),
});

// 提交时补全is_admin
const onSubmit = (formData: Omit<IAuthLogin, 'is_admin'>) => {
    const submitData: IAuthLogin = {
        ...formData,
        is_admin: true,
    };
    // 执行提交操作
};

核心原则

React Hook Form的Resolver会根据Yup Schema自动推断表单字段类型,必须保证useForm的泛型类型与Schema、默认值的字段结构完全一致,才能避免类型不匹配问题。

内容的提问来源于stack exchange,提问作者Meet Makwana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:22:53