At this moment I'm trying to build a user input form where a user is supposed to enter a name, email and password, using Formik in React & TypeScript.
Handling inputs itself is working fine, and now I want to add validation functionality to the input form, so I wrote the code like the following.
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>
<Field type="text" name="name"/>
</fieldset>
<fieldset>
<label>Email</label>
<Field type="text" name="email"/>
</fieldset>
<ErrorMessage name="password" component="div"/>
<fieldset>
<label>Password</label>
<Field type="password" name="password"/>
</fieldset>
<button type="submit">Save</button>
</Form>
)
}
</Formik>
</div>
)
I wanted to show an error message depending on whether the user has entered a password whose length is long enough, but no error message shows up even when the password is too short.
I added a console.log in the validation method and made sure that the method was invoked.
When the password was long enough, like 12 characters long, the part
console.log("The length of errors.password: " + values.password.length);
is invoked and the length of the password is displayed, but when the length becomes shorter than 8, instead of assigning the string 'Enter at least 8 characters for your password' to the errors.password, a warning shows up.
Warning: An unhandled error was caught during low priority validation in <Formik validate /> TypeError: Cannot set property 'password' of undefined
I looked into several GitHub pages and Stack Overflow posts, but haven't found one that seems to be related to my issue.
What am I doing wrong?
The same code was working fine in JavaScript, as my current version is TypeScript maybe there is something that I'm missing?