Eine eigene strukturelle Direktive ist nur so sicher wie die Typisierung ihres Template-Kontexts. `ngTemplateContextGuard` ist eine statische Type-Guard-Methode, die der Angular-Compiler zur Kompilierzeit (über den Ivy-Template-Type-Checker) aufruft, um zu prüfen, ob mit `let-foo` deklarierte Variablen im Template tatsächlich zur Kontext-Form passen, die `createEmbeddedView` ausgibt. Ohne sie kompiliert `<ng-template let-x>` selbst dann, wenn `x` auf dem Kontextobjekt gar nicht existiert — die Abweichung fällt erst zur Laufzeit auf. Zusammen mit `ngTemplateGuard_ifRole: 'binding'` sagt man dem Compiler zusätzlich, den Typ des gebundenen Ausdrucks selbst zu verengen, sodass der Template-Körper `role` als `string` sieht, nicht als `string | null`.
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';interface IfRoleContext {$implicit: boolean;ifRole: string;}@Directive({selector: '[ifRole]',standalone: true,})export class IfRoleDirective {private hasView = false;constructor(private templateRef: TemplateRef<IfRoleContext>,private viewContainer: ViewContainerRef,) {}@Input() set ifRole(role: string) {const allowed = role === 'admin';if (allowed && !this.hasView) {this.viewContainer.createEmbeddedView(this.templateRef, {$implicit: true,ifRole: role,});this.hasView = true;} else if (!allowed && this.hasView) {this.viewContainer.clear();this.hasView = false;}}static ngTemplateGuard_ifRole: 'binding';static ngTemplateContextGuard(dir: IfRoleDirective,ctx: unknown,): ctx is IfRoleContext {return true;}}