TL;DR — If you can explain these 13 ideas from code, you won’t “pass the interview.” You’ll set the bar. This isn’t a “tips & tricks” post. It’s a code-first mental model for senior Angular interviews in 2026: correct snippets, and measurable performance instincts. 1) Change detection & OnPush

2) Observables: cancellation + core RxJS operators

3) DI hierarchies: provider scope + tree-shakable providers

4) Lazy loading + targeted preloading

5) Router guards, resolvers, and route composition

6) Reactive forms with performance in mind

7) NgZone + running work outside Angular

8) trackBy, pure pipes, and memoization for lists

9) Build targets: AOT, prod flags, bundle analysis

10) State patterns: local vs global + Signals (or stores)

11) Testing: TestBed, shallow tests, spies

12) Security: XSS, CSP, sanitizer usage

13) Performance profiling + measurable metrics Each section gives: Problem (what breaks in real systems) Change (what you do in Angular 17–21+) Code (minimal, interview-whiteboard friendly) Why it works (the mechanism) Interview move (the “senior” answer) OnPush

Problem

Default change detection checks more than you think. Small UI updates become expensive as the tree grows. Adopt push-based updates: ChangeDetectionStrategy.OnPush plus immutable inputs via Observables or Signals. import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { Observable } from 'rxjs';

interface User { id: string; name: string; }

@Component({ selector: 'user-row', template: `{{ user$ | async | json }}`, changeDetection: ChangeDetectionStrategy.OnPush }) export class UserRow { @Input() user$!: Observable<User>; }

With OnPush, Angular checks this component when: an @Input reference changes (identity change), an Observable emits through async, you manually signal (markForCheck, Signals effects, or events). Explain when OnPush won’t update (mutating objects, “same reference”) and how you fix it: immutable updates, ChangeDetector