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.

Anidación infinita ¡Sí!

Tengo un objeto que puede contener hijos del mismo tipo de objeto, lo que lo hace potencialmente anidado infinitamente. Aquí hay una versión simplificada de la interfaz TS.

interface Query {operation: Operation, innerQuery?: Query} 

Estoy utilizando la interfaz Query en un formulario y quiero usar yup para validarla, pero no he encontrado una forma de hacer que un objeto yup haga referencia a sí mismo. ¿Alguien conoce una solución para este problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, yup no admite esquemas autorreferenciales por el momento. Sin embargo, existen soluciones alternativas para lograr esto.

    Un enfoque es utilizar el método lazy() proporcionado por yup para crear un esquema temporal que se referencia a sí mismo de manera recursiva. Aquí tienes un ejemplo:

    import * as Yup from 'yup';
    
    const querySchema: Yup.ObjectSchema<
      { operation: Operation; innerQuery?: Query }
    > = Yup.object({
      operation: Yup.string().required(),
      innerQuery: Yup.lazy(() => querySchema.nullable()),
    });
    

    En el código anterior, querySchema contiene un esquema lazy() para la propiedad innerQuery. El método lazy() recibe una función que devuelve la definición del esquema. En este caso, devuelve querySchema en sí mismo, pero envuelto en el método nullable() para evitar la recursión infinita en caso de propiedades faltantes.

    Con esta definición de esquema, ahora puedes utilizarlo para validar tu objeto Query:

    const query: Query = { operation: 'someOperation', innerQuery: { operation: 'nestedOperation' } };
    
    try {
      await querySchema.validate(query);
      console.log('Validación exitosa');
    } catch (err) {
      console.log('Validación fallida', err);
    }
    

    Este enfoque funcionará para cualquier nivel de anidamiento, incluido el anidamiento infinito. Puedes ajustar la definición del esquema según tus necesidades específicas.

Comments are closed.