Entrevistas de Angular cobrem dependency injection, RxJS, change detection, e TypeScript — o framework é opinativo, então as perguntas testam se você entende sua maquinaria. Aqui estão as mais comuns com respostas modelo.
Cada pergunta vem com uma resposta modelo para você comparar com a sua.
1
Como funciona Dependency Injection no Angular? O que são providers?
Resposta
O Angular tem uma árvore hierárquica de injectors: uma solicitação de uma dependência sobe do injector do componente até a raiz. Um provider diz ao injector como criar o token — useClass, useValue, useFactory, ou useExisting. Prover um serviço em root dá um singleton para toda a app; prová-lo em um componente cria uma instância nova por instância de componente, o que é como você limita estado a uma feature.
2
Qual é a diferença entre um Observable e uma Promise?
Resposta
Uma Promise é um único valor futuro que começa a executar imediatamente e não pode ser cancelada. Um Observable é um stream de zero ou mais valores, é lazy até ser assinado, pode ser cancelado ao se desinscrever, e pode ser transformado com operadores como debounce, retry, ou switchMap. Para chamadas HTTP o benefício prático é o cancelamento — um typeahead pode descartar o request anterior quando o usuário continua digitando.
3
Explique change detection. Em que OnPush difere de Default?
Resposta
Change detection percorre a árvore de componentes depois de eventos, timers, ou respostas HTTP e re-renderiza qualquer binding que mudou. Default verifica cada componente a cada ciclo. OnPush verifica um componente só quando uma referência de input muda, um evento dispara dentro dele, ou um async pipe emite — por isso OnPush exige dados imutáveis: mutar um objeto in place não muda sua referência e a view não vai atualizar.
4
O que são map, switchMap e mergeMap? Qual é a diferença?
Resposta
map transforma cada valor emitido. switchMap e mergeMap achatam um observable interno: switchMap cancela a assinatura interna anterior quando chega um valor novo, mergeMap roda todas concorrentemente. Use switchMap para busca ou navegação onde só importa o último resultado, mergeMap quando cada request deve completar — e concatMap quando a ordem importa.
5
O que é ngOnInit e em que difere do constructor?
Resposta
O constructor roda quando a classe é instanciada, antes de o Angular ter setado qualquer binding de input, então os inputs ainda são undefined ali. ngOnInit roda depois da primeira passagem de binding, por isso a inicialização que depende de inputs pertence ali. A convenção é que constructors só recebem dependências injetadas e ngOnInit faz o trabalho real de setup.
6
Qual é a diferença entre formulários template-driven e reactive?
Resposta
Formulários template-driven constroem o modelo implicitamente a partir de diretivas no template e servem bem para casos simples. Formulários reactive definem um FormGroup na classe do componente, o que torna validação, controles dinâmicos e testes explícitos e type-safe. Reactive é a recomendação padrão para qualquer coisa além de um login, porque o estado do formulário vive em código onde você pode raciocinar sobre ele.
7
Como você evita vazamentos de memória com Observables?
Resposta
Uma assinatura que nunca é fechada mantém vivo seu callback e escopo capturado depois que o componente é destruído. A solução mais limpa é o async pipe, que assina e desassina automaticamente. Caso contrário, use takeUntilDestroyed, ou colete assinaturas e desinscreva-se em ngOnDestroy — a falha comum é um stream de longa duração como um evento de router ou um websocket.
8
O que é um pipe? Como você cria um personalizado?
Resposta
Um pipe transforma um valor para exibição em um template, mantendo a formatação fora da classe do componente. Você cria um com o decorator @Pipe e um método transform. Pipes são puros por padrão, o que significa que o Angular só os reavalia quando a referência do input muda, o que os mantém baratos — marcar um pipe como impuro faz ele rodar a cada ciclo de change detection e deveria ser o último recurso.