Durante los últimos años, he entrevistado a decenas de candidatos para puestos de desarrollador Angular. En estas evaluaciones técnicas, noté un patrón muy claro: los desarrolladores que entienden el por qué de los patrones arquitectónicos destacan de inmediato frente a quienes solo memorizan la sintaxis.
Angular ha evolucionado con Standalone Components, el modelo de reactividad con Signals, el nuevo control flow integrado (@if, @for, @let), pruebas unitarias modernas con Vitest y la ejecución experimental Zoneless. Quienes lideran entrevistas técnicas buscan personas que comprendan tanto las bases de código heredadas (legacy) como los paradigmas modernos.
En esta guía reuní las preguntas más frecuentes de entrevista en Angular para roles junior y mid-level, junto con las respuestas esperadas, fragmentos de código y los errores comunes que debes evitar.
Las entrevistas para perfiles junior se centran en los bloques fundamentales: el ciclo de vida de los componentes, estado básico y Signals, sintaxis de plantillas, inyección de dependencias y formularios.
Respuesta esperada: Los Standalone Components eliminan la necesidad de usar NgModule. Al configurar standalone: true (que ya viene por defecto), el componente importa sus dependencias (otros componentes, directivas o pipes) directamente dentro de su decorador @Component({ imports: [...] }). Esto mejora el tree-shaking, simplifica la estructura del proyecto y facilita reutilizar componentes.
Error común: Olvidar que ya no necesitas importar CommonModule cuando usas el nuevo control flow integrado (@if, @for).
Respuesta esperada: Un signal() es un contenedor reactivo alrededor de un valor que notifica a los consumidores cuando ese valor cambia. Las Signals ofrecen reactividad granular:
Error común: Llamar a las signals sin paréntesis en las plantillas ({{ count }} en lugar de {{ count() }}) o mutar objetos complejos directamente dentro de set() sin crear una nueva referencia.
constructor: Es un método estándar de TypeScript que se debe usar solo para inicializaciones ligeras (por ejemplo, asignar dependencias inyectadas mediante inject()). Aquí nunca debes colocar lógica pesada ni peticiones HTTP.
ngOnInit: Es un hook del ciclo de vida de Angular que se ejecuta una vez que los inputs del componente están listos. Es el lugar ideal para inicializar el estado, pedir datos iniciales o suscribirse a flujos.
ngOnDestroy: Se ejecuta justo antes de que Angular destruya el componente. Se usa para tareas de limpieza, como cancelar suscripciones manuales de RxJS, limpiar timers o desconectar listeners de eventos.
Error común: Hacer peticiones HTTP dentro del constructor antes de que los inputs del componente y la vista estén inicializados.
Reactive Forms: Son programáticos y sincrónicos. Los controles (FormControl, FormGroup, FormArray) se definen en la clase de TypeScript. Cuentan con tipado estricto, son fáciles de probar con tests unitarios y resultan ideales para validaciones dinámicas y complejas.
Template-Driven Forms: Se basan en directivas en la plantilla (ngModel, ngForm). Son asincrónicos y prácticos para formularios simples con enlace bidireccional, pero son más difíciles de probar de forma unitaria sin renderizar el DOM.
Error común: Confundir el tipado estricto en Reactive Forms o intentar modificar los valores del formulario directamente sin usar .setValue() o .patchValue().
Respuesta esperada: La Inyección de Dependencias (DI) es un patrón de diseño donde una clase recibe sus dependencias desde un inyector externo en vez de crearlas por sí misma. El Angular moderno usa la función inject() en inicializadores en lugar de la inyección por constructor:
Las preguntas para perfiles mid-level evalúan tu comprensión de la arquitectura asincrónica, optimización de rendimiento, pruebas unitarias con Vitest, estrategias con operadores de RxJS y la ejecución moderna Zoneless.
Signals: Ideales para manejo de estado sincrónico, reactividad de la interfaz, estado derivado (computed()) y renderizado en plantillas.
RxJS: Indispensable para operaciones asincrónicas complejas, manejo de eventos en el tiempo, debouncing, web sockets, polling y lógica de reintentos.
Interoperabilidad: Angular ofrece @angular/core/rxjs-interop con toSignal() y toObservable() para conectar ambos mundos con facilidad.
Error común: Creer que las Signals reemplazan por completo a RxJS. Los Observables siguen siendo el estándar para flujos de eventos asincrónicos y llamadas HTTP.
Respuesta esperada: Históricamente, Angular usaba Karma y Jasmine, herramientas que dependían de iniciar una instancia real del navegador y tenían tiempos de arranque lentos. En el Angular moderno, Vitest tiene soporte nativo a través del builder de pruebas de @angular/build. Vitest ejecuta las pruebas directamente en Node.js usando ESM, completando suites enteras en milisegundos con utilidades integradas de mocking (vi.fn(), vi.spyOn()) y manteniendo las APIs de TestBed.
Error común: Seguir usando el módulo obsoleto HttpClientTestingModule en lugar de la función moderna provideHttpClientTesting().
Respuesta esperada: Tradicionalmente, Angular dependía de zone.js para interceptar APIs asincrónicas del navegador (eventos del DOM, temporizadores, promesas) y disparar la detección de cambios de arriba hacia abajo. Zoneless Angular (provideExperimentalZonelessChangeDetection()) elimina zone.js, apoyándose en Signals y notificaciones directas del framework para actualizar la vista de forma quirúrgica. Esto reduce el tamaño del bundle en unos 15 kB y mejora el rendimiento en tiempo de ejecución.
Error común: Creer que Zoneless obliga a reescribir todos los componentes, cuando en realidad los componentes basados en Signals funcionan de forma natural sin Zone.js.
switchMap: Cancela el observable interno anterior cuando llega un nuevo valor. Caso de uso: Búsquedas en tiempo real (descarta peticiones obsoletas).
mergeMap: Ejecuta todos los observables internos de forma concurrente sin cancelar ni esperar. Caso de uso: Descargas en paralelo o subida de varios archivos al mismo tiempo.
concatMap: Encola los observables internos en secuencia, ejecutando uno tras otro en orden estricto. Caso de uso: Secuencia de transacciones bancarias u operaciones de guardado ordenadas.
exhaustMap: Ignora nuevos valores mientras el observable interno actual se esté ejecutando. Caso de uso: Botones de envío en formularios (evita dobles clics o envíos duplicados).
Error común: Usar mergeMap en campos de búsqueda, lo que genera condiciones de carrera (race conditions) donde respuestas viejas pueden sobrescribir resultados más nuevos.
Default (ChangeDetectionStrategy.Default): Angular ejecuta la detección de cambios en todo el árbol de componentes ante cualquier evento del navegador.
OnPush: Angular revisa el componente únicamente cuando:
Cambia la referencia de un @Input() o de un signal input().
Se dispara un manejador de eventos dentro del componente o de sus hijos.
Un pipe async emite un nuevo valor o una Signal leída en la plantilla se actualiza.
Se solicita la detección de cambios manualmente mediante ChangeDetectorRef.markForCheck().
Error común: Mutar un arreglo u objeto directamente (por ejemplo, items.push(newItem)) y esperar que un componente con OnPush se actualice sin generar una nueva referencia (items = [...items, newItem]).
Angular divide los componentes diferidos en fragmentos (chunks) de JavaScript independientes que solo se descargan cuando se cumple la condición del disparador.
Error común: No incluir bloques de respaldo como @placeholder o @loading para cuidar la experiencia del usuario.
¿Cuáles son las preguntas de entrevista más comunes sobre Angular para perfiles junior en 2026?
Las entrevistas junior se enfocan en conceptos fundamentales: ciclo de vida de componentes, Signals frente a estado primitivo, nuevo control flow en plantillas (@if, @for con track), formularios reactivos tipados y la función inject().
¿Cuál es la diferencia entre Angular Signals y RxJS Observables en una entrevista?
Signals representan estado sincrónico y libre de inconsistencias (glitch-free) con reactividad granular y seguimiento de valores (get/set). Los Observables representan flujos de eventos asincrónicos en el tiempo con operadores de transformación (debouncing, cancelación, combinación).
¿Cómo se hacen las pruebas unitarias en Angular moderno en comparación con versiones anteriores?
Angular moderno pasó de Karma y Jasmine a Vitest y ESM nativo con TestBed, usando vi.fn() y provideHttpClientTesting() para ejecutar pruebas muy rápido sin la sobrecarga de un navegador real.
¿Qué es Zoneless Angular y cómo cambia la detección de cambios?
Zoneless Angular elimina la necesidad de zone.js y sus modificaciones a las APIs del navegador, apoyándose en Signals y notificaciones directas al planificador (provideExperimentalZonelessChangeDetection()) para mejorar el rendimiento y reducir el tamaño del bundle.