Búsqueda de sitios web

node.js - Mapear de una interfaz a otra


Vengo de Java y normalmente uso DTO para mapear a Entity y viceversa. Pero me está resultando difícil hacer esto en Typescript + Nodejs. Lo que tengo son dos interfaces:

export interface IOne {
    clientId: number;
    clientName: string;
    ...
}

export interface ITwo {
    userId: number;
    userName: string;
    ...
}

Se recibe una llamada GET en el formato de la Interfaz Uno y la Interfaz Dos es responsable de capturar esta respuesta y hacer una solicitud POST después.

La siguiente implementación obtiene undefined:

let userTwo: ITwo;

userTwo.map(data => {
    return <ITwo> {
        userId: data.clientId,
        userName: data.clientName,
        ...
    };
});

¿Cuál es la manera correcta en Typescript/Nodejs de mapear la respuesta devuelta en un formato de interfaz y luego convertirla a otro formato de interfaz en el patrón DTO a Objeto de Dominio?

Respuesta #1

Podrías hacer algo como esto:

export interface IOne {
    clientId: number;
    clientName: string;
    ...
}

export interface ITwo {
    userId: number;
    userName: string;
    ...
}

const toDTO = (input: IOne): ITwo => {
  return {
    userId: input.clientId,
    userName: input.clientName
  }
}

const handleReq = (req) => {
  // we assume you have to tell Typescript what userOne is
  const userOne = req.userOne as IOne[]
  // userTwo will be typed as ITwo[] or Array<ITwo> through inference
  const userTwo = userOne.map(u => toDTO(u))
}

Respuesta #2

Una guía completa sobre cómo implementar DTOs en TypeScript se puede encontrar en el siguiente artículo:

https://khalilstemmler.com/articles/typescript-domain-driven-design/repository-dto-mapper/

Contiene más detalles, pero también muestra las buenas prácticas de implementar lo que pediste.