Formik useFormik绑定原生input报value类型错误但MUI TextField正常
报错原因
- 该TypeScript报错核心是原生
<input>标签的value属性不接受null类型,仅允许string | number | readonly string[] | undefined四类值 - 你的Formik values中
name字段的类型包含null,直接赋值给原生input的value就会触发类型不匹配错误 - Material UI的
TextField组件内部对传入的value做了兼容处理,会自动把null/undefined转换为空字符串,所以不会触发报错
解决方案
你可以任选以下任意一种方案解决问题:
- 方案1:初始化Formik时设置非null初始值
定义initialValues参数时直接把name字段的初始值设为空字符串'',从根源上避免值为null的情况:const formik = useFormik({ initialValues: { name: '', // 不要设置为null // 其余字段配置 }, // 其余Formik配置 }) - 方案2:给value属性加兜底兼容
如果业务逻辑中确实存在name字段为null的场景,可以在赋值时用空值合并运算符做兼容,当值为null/undefined时自动回退为空字符串:<input id="name" name="name" type="text" onChange={formik.handleChange} value={formik.values.name ?? ''} /> - 方案3:从TypeScript类型层面约束
给useFormik指定泛型,明确所有表单字段的类型不包含null:// 定义表单值的类型,明确name字段为string类型,不允许null type FormValues = { name: string // 其余字段的类型定义 } const formik = useFormik<FormValues>({ // Formik配置项 })
如果你需要实现和Material UI TextField一致的错误提示效果,可以自行补充对应的样式和展示逻辑:
<label htmlFor="name">Name</label> <input id="name" name="name" type="text" onChange={formik.handleChange} value={formik.values.name ?? ''} style={{ border: formik.touched.name && formik.errors.name ? '1px solid #f44336' : '1px solid rgba(0,0,0,0.23)' }} /> {formik.touched.name && formik.errors.name && ( <span style={{ color: '#f44336', fontSize: '0.75rem', marginTop: '3px', display: 'block' }}> {formik.errors.name} </span> )}
内容的提问来源于stack exchange,提问作者elderlyman
相关产品推荐
相关产品推荐

