Trabajar con TypeScript en Angular se vuelve mucho más sólido cuando defines modelos tipados para cada entidad de tu aplicación. Si vas a construir un chat con inteligencia artificial conectado a Firebase, necesitas modelar usuarios y mensajes desde el inicio para que el editor te avise de errores y los datos viajen seguros entre componentes y servicios.
¿Por qué conviene tipar los modelos antes de tocar componentes?
Cuando defines interfaces claras, Visual Studio Code te asiste con autocompletado y validación en tiempo real. Eso significa menos bugs silenciosos y más confianza al refactorizar. En este flujo, los modelos viven en src/app/models, separados en archivos para chat y usuario [00:20].
¿Qué es un modelo en TypeScript? Es una interfaz o tipo que describe la forma exacta de un objeto. Define qué propiedades existen, de qué tipo son y si pueden ser nulas.
¿Cómo se estructura el modelo de mensaje individual?
El modelo MensajeChat representa cada burbuja de conversación. Tiene la información mínima para renderizar y rastrear el estado del mensaje en pantalla.
id: identificador único del mensaje.
usuarioId: vincula el mensaje al usuario correcto.
contenido: el texto que se muestra.
fechaEnvio: tipo Date, ya formateada.
tipo: enumerado con dos opciones, usuario o asistente, para distinguir quién habla en el chat con IA [00:55].
estado: cuatro valores posibles, enviando, enviado, error y temporal, que controlan la visualización [01:15].
Esos estados son clave porque te permiten mostrar un spinner mientras se envía, un check cuando llega y un ícono de error si algo falla. La UI reacciona al modelo, no al revés.
¿Cómo modelar la conversación completa?
Una conversación agrupa varios mensajes y necesita su propia identidad en la base de datos. El modelo ConversacionChat incluye un array de MensajeChat y metadatos para ordenar y listar conversaciones.
id: identifica la conversación en Firebase.
usuarioId: dueño de la conversación.
mensajes: array del tipo MensajeChat.
fechaCreacion y ultimaActividad: para ordenar por recencia.
titulo: nombre legible que ayuda a encontrarla en la base de datos [01:45].
¿Por qué guardar usuarioId en cada mensaje y en la conversación? Porque te permite validar permisos en dos niveles y filtrar consultas a Firebase sin traer datos ajenos al usuario logueado.
¿Qué campos necesita el modelo de usuario para Firebase?
El modelo Usuario se mapea con lo que Google entrega al autenticar. Aunque uses nombres en español, después harás la traducción dentro del service de autenticación.
id: tipo uniqueId, único por usuario.
email: correo asociado a la cuenta de Google.
nombre: nombre visible.
urlFoto: avatar del usuario.
fechaCreacion y ultimaConexion: para auditoría y métricas.
Firebase espera ciertos nombres y formatos, pero no estás obligado a copiarlos tal cual. El service de autenticación se encarga de traducir entre tu modelo en español y la estructura que Google requiere [02:30].
¿Cómo aplicar los modelos en los componentes Angular?
Una vez creadas las interfaces, toca llevarlas al componente de chat. Ahí están los puntos donde TypeScript necesita saber con qué tipo de dato trabaja.
¿Cómo tipar una propiedad que arranca en null?
La variable usuario empieza en null antes de que alguien inicie sesión. TypeScript exige que declares ambos tipos posibles.
typescript
usuario: Usuario | null = null;
Con Ctrl + Espacio importas la interfaz Usuario automáticamente. La unión Usuario | null permite el estado inicial vacío y, una vez autenticado, el valor pasa a ser un objeto Usuario completo que el resto de la aplicación consume [03:10].
¿Cómo tipar el array de mensajes y el trackBy?
El array que renderiza el historial debe ser de tipo MensajeChat[]. También la función de trackeo del *ngFor recibe un parámetro tipado como MensajeChat, no como cualquier objeto suelto.
typescript
mensajes: MensajeChat[] = [];
trackByMensaje(index: number, mensaje: MensajeChat) {
return mensaje.id;
}
Si la importación no aparece, Ctrl + Espacio la trae sin problema. Tipar el trackBy mejora el rendimiento de Angular al renderizar listas largas, porque el framework sabe exactamente qué propiedad usar como identificador.
¿Dónde se usan estos modelos después?
Los modelos Usuario, MensajeChat y ConversacionChat se reutilizan en los services, que son las clases responsables de hablar con Firebase, manejar autenticación y enviar mensajes a la inteligencia artificial. Cada service recibe y devuelve datos tipados, así que el flujo completo, desde el clic del usuario hasta la respuesta de la IA, queda protegido por el sistema de tipos [04:20].
Con los modelos listos, el siguiente paso es construir los services y conectarlos a los componentes. ¿Cómo organizas tú los modelos en tus proyectos Angular? Cuéntame en los comentarios.