Ein Resolver, der bei 403 oder 404 wirft, zwingt jede konsumierende Komponente auf eine generische Router-Fehlerseite und verwirft dabei den spezifischen Grund, aus dem die Navigation anders behandelt werden sollte. Stattdessen eine diskriminierte Union zurückzugeben lässt `ActivatedRoute.data` ein typisiertes `kind`-Feld tragen, über das das Komponenten-Template per `@switch` verzweigen kann, sodass eine Paywall-Meldung und eine Not-found-Meldung ohne zweiten Roundtrip getrennt bleiben. Das tauscht die eingebaute Fehlerbehandlungs-Pipeline des Routers gegen explizites, erschöpfend geprüftes Branching in der Komponente — der Resolver lehnt nie ab, sodass `withComponentInputBinding` oder ein Route-Guard den Fehlergrund nicht versehentlich verschlucken kann.
import { ResolveFn } from '@angular/router';import { inject } from '@angular/core';type LoadResult =| { kind: 'ok'; payload: { id: string; title: string } }| { kind: 'forbidden'; reason: string }| { kind: 'missing' };export const articleResolver: ResolveFn<LoadResult> = async (route) => {const id = route.paramMap.get('id');if (!id) {return { kind: 'missing' };}const service = inject(ArticleGateway);const res = await service.fetchRaw(id);if (res.status === 403) {return { kind: 'forbidden', reason: 'not-subscribed' };}if (res.status === 404) {return { kind: 'missing' };}return { kind: 'ok', payload: res.body };};declare class ArticleGateway {fetchRaw(id: string): Promise<{ status: number; body: { id: string; title: string } }>;}