`input.required<Severity, string>({ transform: toSeverity })` deklariert zwei unterschiedliche Typen für denselben Input: `string` ist das, was ein Template-Autor binden darf (`[severity]="someString"`), während `Severity` das ist, was der Komponentenkörper über `severity()` zurückliest. Die `transform`-Funktion läuft synchron zum Bindungszeitpunkt und ist die einzige Brücke zwischen beiden — der Compiler erzwingt, dass der Parametertyp der Transform-Funktion zum Schreibtyp passt und ihr Rückgabetyp zum Lesetyp, sodass eine unpassende Transform-Funktion einen Kompilierfehler auslöst, statt einen unvalidierten String stillschweigend durchzulassen. Weil der Input `required` ist, verweigert TypeScript zudem das Kompilieren jedes Templates, das `AlertBannerComponent` instanziiert, ohne `severity` zu binden.
import { Component, input } from '@angular/core';type Severity = 'low' | 'medium' | 'high';function toSeverity(value: string): Severity {const normalized = value.toLowerCase();if (normalized === 'low' || normalized === 'medium' || normalized === 'high') {return normalized;}throw new Error(`Invalid severity value: "${value}"`);}@Component({selector: 'app-alert-banner',standalone: true,template: `<div [class]="'banner-' + severity()">{{ message() }}</div>`,})export class AlertBannerComponent {severity = input.required<Severity, string>({ transform: toSeverity });message = input.required<string>();}