Search code examples
javascriptyup

How can I make a yup number accept nullable values?


I have the following yup check:

nrOfApples: yup.number().min(0).max(999),

And right now if I leave the field blank, it validates as false. Is there any way to make yup.number() accept empty values? I have tried:

yup.number().nullable()

But it doesn't seem to work. Any ideas on how I can make such thing happen?


Solution

  • You have to pass true to nullable -

    nrOfApples: yup.number().min(0).max(999).nullable(true);

    From: https://github.com/jquense/yup/issues/500

    Working example: https://runkit.com/xdumaine/5f2816c75a0ba5001aa312b2

    Note that if you add required().nullable(true) the required overrides the nullable and null will not validate.

    Update:

    You can use a transform to convert the NaN value into null. I updated the runkit with this:

    const contactSchema = yup.object({
      name: yup.string()
        .required(),
      nrOfApples: yup
        .number()
        .min(0)
        .max(999)
        .nullable(true)
        // checking self-equality works for NaN, transforming it to null
        .transform((_, val) => val === Number(val) ? val : null) 
    })