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.

Hacer que el modelo de objeción coincida con la interfaz TS.

Estoy trabajando para implementar una api usando express/objection js y typescript.

Tomé mucha inspiración de este repositorio: https://github.com/HappyZombies/brackette-alpha/tree/master/server/src

Al igual que el creador, quiero tener diferentes interfaces para el mismo “componente” (por ejemplo: usuario).

Podemos ver aquí que él crea diferentes interfaces (aquí) y las utiliza en sus servicios como una promesa devuelta (aquí), pero no hay una verificación de que lo que él devuelve coincida con su interfaz. Por ejemplo, para que coincida con su interfaz prometida aquí, solo seleccionará los campos sql que coincidan con su interfaz.

Mis preguntas son:
– ¿Hay alguna manera de seleccionar solo los campos que deseas de los resultados del modelo según la descripción de la interfaz?
– De lo contrario, ¿hay alguna manera de verificar que la interfaz coincida con los resultados del modelo?

Gracias por leer.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existen formas de lograr ambos objetivos. Un enfoque sería definir una interfaz que extienda la interfaz Model de Objection.js y especifique solo las columnas que deben ser devueltas, de la siguiente manera:

    interface IUserMinimum extends Model {
      username: string;
      displayName: string;
    }
    

    Luego, en tu método de servicio, puedes usar el método select() de Objection.js para seleccionar las columnas específicas que deseas de la base de datos, así:

    public async findAll(): Promise<iuserminimum[]> {
      let users;
      try {
        users = await this.usersModel.query().select('username', 'displayName');
      } catch (err) {
        this.logger.error(err);
        throw err;
      }
      return users;
    }
    

    Esto asegurará que solo se devuelvan las columnas especificadas en el resultado, que coincidirán con la interfaz IUserMinimum.

    Alternativamente, podrías utilizar una biblioteca como io-ts o ts-runtime para especificar la comprobación de tipo en tiempo de ejecución de tus objetos. Con cualquiera de estas bibliotecas, puedes definir un tipo para el resultado esperado y luego validar que el resultado coincida con ese tipo en tiempo de ejecución. Por ejemplo, con io-ts:

    import * as t from 'io-ts';
    
    const userMinimum = t.type({
      username: t.string,
      displayName: t.string,
    });
    
    public async findAll(): Promise<iuserminimum[]> {
      let users;
      try {
        users = await this.usersModel.query().column('username', 'displayName');
      } catch (err) {
        this.logger.error(err);
        throw err;
      }
      const result = userMinimum.decode(users);
      if (result.isLeft()) {
        throw new Error(`Resultado no válido: ${result}`);
      }
      return result.value;
    }
    

    Este enfoque asegura que el resultado coincida con el tipo esperado y lanzará un error si no lo hace, lo que te ayudará a detectar discrepancias temprano en el desarrollo.</iuserminimum[]></iuserminimum[]>

Comments are closed.