es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo validar que una propiedad de objeto es obligatoria?

Tengo tipos de objeto con una propiedad ‘traducciones’ en las que se pasan los campos que pueden ser traducidos a diferentes idiomas en la propiedad específica ‘lang’, como se puede ver en el esquema a continuación.

Siempre se requiere una traducción en inglés y el resto de los idiomas son opcionales, lo que se puede lograr configurando ‘.default (undefined)’ para los idiomas opcionales.

Cuando un idioma está presente y la validación de sus campos internos falla, el error siempre se asocia al campo en sí (‘nombre’ en este caso). Este comportamiento es esperado.

Lo que también quiero lograr y no sé cómo es mostrar un error cuando la propiedad ‘traducciones’ ‘en’ no está presente con un mensaje como ‘Se requiere una traducción en inglés’.

“`const categoryTranslationsSchema = objeto({

name: cadena()
.min (3,'Debe tener al menos 3 caracteres.')
.max (16,'No puede ser más largo que 16 caracteres.')
.requerido('Debe proporcionar un nombre.')
})

const categorySchema = objeto({

slug: cadena()
.min (3,'Debe tener al menos 3 caracteres.')
.max (16,'No puede ser más largo que 16 caracteres.')
.minuscule()
.recortar()
.matches(/^(?![0-9-]+$)(?:[a-z]{2,}-?|[0-9]-?)+(?<!-)$/gm,'Debe comenzar con una letra y solo puede contener letras, números o guiones (no más de uno consecutivo).')
.requerido('Se requiere el slug.'),

traducciones: objeto({
en: categoryTranslationsSchema,
es: categoryTranslationsSchema
.defecto (undefined),
de: categoryTranslationsSchema
.defecto (undefined)
})
})“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mostrar un error cuando la propiedad ‘en’ de la propiedad ‘translations’ no está presente con un mensaje como ‘Se requiere una traducción en inglés’, puedes usar el método test de yup.

    Primero, crea una función de validación personalizada que compruebe si el objeto ‘translations’ tiene la propiedad ‘en’:

    const englishTranslationRequired = () => {
      return this.test('english-translation-required', 'Se requiere una traducción en inglés', function (obj) {
        if (!obj || !obj.en) {
          return false;
        }
        return true;
      });
    }
    

    Luego, añade esta función de validación personalizada al esquema de validación para el objeto ‘categorySchema’:

    const categorySchema = object({
      slug: string()
        .min(3, 'Debe tener al menos 3 caracteres.')
        .max(16, 'No puede tener más de 16 caracteres.')
        .lowercase()
        .trim()
        .matches(/^(?![0-9-]+$)(?:[a-z]{2,}-?|[0-9]-?)+(?<!-)$/gm, 'Debe empezar por una letra y solo puede contener letras, números o guiones (no más de uno consecutivo).')
        .required('Se requiere la propiedad slug.'),
      translations: object({
        en: categoryTranslationsSchema,
        es: categoryTranslationsSchema
            .default(undefined),
        de: categoryTranslationsSchema
            .default(undefined)
      })
    }).test(englishTranslationRequired());
    

    Ahora, si el objeto ‘translations’ no tiene una propiedad ‘en’, la validación fallará y mostrará el mensaje de error ‘Se requiere una traducción en inglés’.

Comments are closed.