javascript / intermediate
Snippet
Durchsetzung von Modell-Typsicherheit mit generischen Basis-Komponenten
Abstrakte Direktiven-Klassen in Angular ermöglichen die Vererbung von gemeinsamem Zustand, Inputs/Outputs und Methoden über mehrere Editor-Komponenten hinweg. Durch generische Typ-Einschränkungen wird sichergestellt, dass erbende Komponenten die Datenmodelle typkonform verarbeiten.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import { Directive, EventEmitter, Input, Output } from '@angular/core';export interface BaseEntity {id: string | number;updatedAt: Date;}@Directive()export abstract class BaseEditorComponent<T extends BaseEntity> {@Input({ required: true }) entity!: T;@Output() save = new EventEmitter<T>();@Output() cancel = new EventEmitter<void>();protected isDirty = false;abstract validateEntity(model: T): boolean;public handleSave(): void {if (this.validateEntity(this.entity)) {this.isDirty = false;this.save.emit(this.entity);}}public handleCancel(): void {this.isDirty = false;this.cancel.emit();}}
angular
Erklärung
1
@Directive()
Dekoriert die abstrakte Basisklasse als Direktive, um Angular-Property-Bindings und DI zu aktivieren.
2
export abstract class BaseEditorComponent<T extends BaseEntity> {
Definiert eine abstrakte Klasse mit generischem Typparameter T, der auf BaseEntity beschränkt ist.
3
@Input({ required: true }) entity!: T;
Definiert ein zwingend erforderliches, typisiertes Input für das zu bearbeitende Modell.
4
abstract validateEntity(model: T): boolean;
Verpflichtet abgeleitete Subklassen zur Implementierung der domänenspezifischen Validierungslogik.
5
if (this.validateEntity(this.entity)) {
Polymorphie: Führt die Validierung der Kindklasse aus, bevor das Speicher-Event ausgelöst wird.