Las entrevistas de Angular cubren dependency injection, RxJS, change detection, y TypeScript — el framework es opinado, así que las preguntas testean si entiendes su maquinaria. Aquí están las más comunes con respuestas modelo.
Cada pregunta viene con una respuesta modelo con la que puedes comparar la tuya.
1
¿Cómo funciona Dependency Injection en Angular? ¿Qué son los providers?
Respuesta
Angular tiene un árbol jerárquico de injectors: una solicitud de una dependencia sube desde el injector del componente hasta la raíz. Un provider le dice al injector cómo crear el token — useClass, useValue, useFactory, o useExisting. Proveer un servicio en root da un singleton para toda la app; proveerlo en un componente crea una instancia nueva por instancia de componente, que es cómo limitas estado a una feature.
2
¿Cuál es la diferencia entre un Observable y una Promise?
Respuesta
Una Promise es un único valor futuro que empieza a ejecutarse inmediatamente y no se puede cancelar. Un Observable es un stream de cero o más valores, es lazy hasta que se suscribe, se puede cancelar desuscribiéndose, y se puede transformar con operadores como debounce, retry, o switchMap. Para llamadas HTTP el beneficio práctico es la cancelación — un typeahead puede descartar el request anterior cuando el usuario sigue escribiendo.
3
Explica change detection. ¿En qué se diferencia OnPush de Default?
Respuesta
Change detection recorre el árbol de componentes después de eventos, timers, o respuestas HTTP y re-renderiza cualquier binding que cambió. Default revisa cada componente en cada ciclo. OnPush revisa un componente solo cuando una referencia de input cambia, un evento se dispara dentro de él, o un async pipe emite — por eso OnPush requiere datos inmutables: mutar un objeto in place no cambia su referencia y la vista no se actualizará.
4
¿Qué son map, switchMap y mergeMap? ¿Cuál es la diferencia?
Respuesta
map transforma cada valor emitido. switchMap y mergeMap aplanan un observable interno: switchMap cancela la suscripción interna anterior cuando llega un valor nuevo, mergeMap las corre todas concurrentemente. Usa switchMap para búsqueda o navegación donde solo importa el último resultado, mergeMap cuando cada request debe completarse — y concatMap cuando el orden importa.
5
¿Qué es ngOnInit y en qué se diferencia del constructor?
Respuesta
El constructor corre cuando la clase se instancia, antes de que Angular haya seteado cualquier binding de input, así que los inputs todavía son undefined ahí. ngOnInit corre después de la primera pasada de binding, por eso la inicialización que depende de inputs pertenece ahí. La convención es que los constructores solo reciben dependencias inyectadas y ngOnInit hace el trabajo real de setup.
6
¿Cuál es la diferencia entre formularios template-driven y reactive?
Respuesta
Los formularios template-driven construyen el modelo implícitamente desde directivas en el template y convienen para casos simples. Los formularios reactive definen un FormGroup en la clase del componente, lo que hace la validación, controles dinámicos, y testing explícitos y type-safe. Reactive es la recomendación por defecto para cualquier cosa más allá de un login, porque el estado del formulario vive en código donde puedes razonarlo.
7
¿Cómo evitas fugas de memoria con Observables?
Respuesta
Una suscripción que nunca se cierra mantiene vivo su callback y scope capturado después de que el componente se destruye. La solución más limpia es el async pipe, que se suscribe y desuscribe automáticamente. Si no, usa takeUntilDestroyed, o colecciona suscripciones y desuscríbete en ngOnDestroy — el fallo común es un stream de larga vida como un evento de router o un websocket.
8
¿Qué es un pipe? ¿Cómo creas uno personalizado?
Respuesta
Un pipe transforma un valor para mostrarlo en un template, manteniendo el formato fuera de la clase del componente. Creas uno con el decorador @Pipe y un método transform. Los pipes son puros por defecto, lo que significa que Angular los reevalúa solo cuando la referencia del input cambia, lo que los mantiene baratos — marcar un pipe como impuro lo corre en cada ciclo de change detection y debería ser el último recurso.