Bridge Observables and Signals using toSignal and toObservable in Angular. Use when converting between RxJS Observables and Angular Signals. (triggers: toSignal, toObservable, takeUntilDestroyed, rxjs angular)
インストール
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
Bridge Observables and Signals using toSignal and toObservable in Angular. Use when converting between RxJS Observables and Angular Signals. (triggers: toSignal, toObservable, takeUntilDestroyed, rxjs angular)
RxJS Interop
Priority: P1 (HIGH)
Principles
Async to Sync: Use toSignal(observable$, { initialValue: defaultValue }) from *
@angular/core/rxjs-interop* to convert Observables (HTTP, Events) to Signals for template
rendering. Call in an injection context (class field or constructor). toSignal
auto-unsubscribes on component destroy. Provide initialValue to avoid undefined.
Sync to Async: Use toObservable(this.query) when you need RxJS operators (**debounceTime
**, switchMap, distinctUntilChanged) on a Signal. Then wrap back with toSignal() if
rendering.
Cleanup: Use takeUntilDestroyed() for manual subscriptions in injection contexts. For
use outside, inject(DestroyRef) and call takeUntilDestroyed(destroyRef).
Guidelines
HTTP Requests:
GET: http.get<User[]>(...).pipe(catchError(() => of([]))) ->
toSignal(..., { initialValue: [] }). Use in templates as {{ users() }}.
Consider httpResource() for simpler reactive HTTP in newer versions.
POST/PUT: Trigger explicit subscribe() or lastValueFrom().
Race Conditions: Handle async loading states. toSignal requires an initialValue or handles
undefined.
Anti-Patterns
No manual subscribe in templates: Use toSignal() for Observables rendered in templates.
No BehaviorSubject for state: Replace with signal() + toObservable() for RxJS interop.
No global takeUntil: Use takeUntilDestroyed() scoped to the injection context. Never use a
global Subject with takeUntil — it leaks if Subject is never completed.