Estoy tratando de validar un campo numérico que es opcional y, por lo tanto, puede estar vacío. Si hay un valor en el campo, debe ser un número positivo.
const schema = yup.object().shape({ gpa: yup.number() .when('gpa', { is: (value) => value?.length > 0, then: yup.number().positive(numberPositiveMessage).typeError(numberMessage), otherwise: yup.number().notRequired().nullable(true).transform(value => (isNaN(value) ? undefined : value)) }, [ ['gpa', 'gpa'], ] );Permite que el resto del formulario se valide cuando el campo está vacío y cuando hay un número positivo allí, pero si ingreso un número negativo o una cadena, no arroja ningún error como debería.
Evite usar required() para que el campo sea opcional. Solo se validaría si estuviera presente.
gpa: yup .number() .positive() .nullable(true) .transform((_, val) => val === val ? val : null) // transform NaN to nullPara la próxima persona que termine aquí tratando de hacer lo mismo, esto funciona para números positivos que pueden ser 0, nulo, indefinido o una cadena vacía, pero no cualquier otra cadena o número negativo:
const schema = yup.object().shape({ gpa: yup.number() .typeError("GPA must be a number") .nullable() .moreThan(0, "Floor area cannot be negative") .transform((_, val) => (val !== "" ? Number(val) : null)), } );La conversión de números desencadena un error de tipo en una cadena que le dará el error definido en .typeError() y usar .moreThan() en lugar de .positive() le permite tener cero (cambie a .positive() si no lo tiene). no quiero permitir 0).