首页 > 解决方案 > 在 TypeScript 中的 Formik 验证中分配错误消息不起作用

问题描述

目前,我正在尝试构建一个用户输入表单,用户应该在其中输入姓名、电子邮件和密码,使用FormikReact 和 TypeScript。

处理输入本身工作正常,现在我想向输入表单添加验证功能,所以我编写了如下代码。

import { Formik, Form, Field, ErrorMessage } from 'formik'; 

validate(values: User){
    let errors: User; 
    errors = values
    if(!values.password){
      errors.password = 'Enter a password'
    } else if(values.password.length < 8){
      errors.password = 'Enter at least 8 characters for your password'
    }
    console.log("The length of errors.password: " + values.password.length);

    return errors;
  }

return(
      <div>
          <Formik
            initialValues={{ name, email, password }}
            onSubmit={this.onSubmit}
            validate={this.validate}
            enableReinitialize={true}
          >
            {
              (props) => (
                <Form>
                  <fieldset>
                    <label>Name</label>&nbsp;
                    <Field type="text" name="name"/>
                  </fieldset>                                   
                  <fieldset>
                    <label>Email</label>&nbsp;
                    <Field type="text" name="email"/>
                  </fieldset>
                  <ErrorMessage name="password" component="div"/>
                  <fieldset>
                    <label>Password</label>&nbsp;
                    <Field type="password" name="password"/>
                  </fieldset>
                  <button type="submit">Save</button>              
                </Form>
              )
            }      
          </Formik>
      </div>
    )

我想根据用户是否输入了长度足够长的密码来显示错误消息,但即使密码太短也不会显示错误消息。

console.logvalidation方法中添加了一个并确保调用了该方法。当密码足够长时,比如 12 个字符,该部分

console.log("The length of errors.password: " + values.password.length);

被调用并显示密码的长度,但是当长度小于 8 时,不会将字符串分配给 ,而是'Enter at least 8 characters for your password'显示errors.password警告。

Warning: An unhandled error was caught during low priority validation in <Formik validate /> TypeError: Cannot set property 'password' of undefined

我查看了几个 GitHub 页面和 Stack Overflow 帖子,但没有找到一个似乎与我的问题相关的帖子。

我究竟做错了什么?

相同的代码在 中运行良好JavaScript,因为我当前的版本TypeScript可能缺少一些东西?

标签: reactjstypescriptvalidationformik

解决方案


它看起来像是在 Formik 的内部验证循环期间undefined作为参数传递给的。validate我建议更改此行:

let errors: User;
errors = values; // why are you assigning your error object to the values?

对此:

let errors: Partial<User> = {};

我不确定为什么要将当前值分配给错误对象。如果没有错误,errors应该是一个空对象({})。

使用新方法,您仍然可以获得类型安全,因为您无法将属性分配给errorsUser 类型中不存在的属性:

errors.password = "Password too short"; // this is fine
errors.foo = "asdf"; // TypeError - No property "foo" in type "User"

推荐阅读