typescript / expert
Snippet
Mixin-Komposition mittels abstrakter Konstruktorsignatur-Typisierung
Abstrakte Konstruktorsignaturen (`abstract new (...args: any[]) => T`) ermöglichen es TypeScript, abstrakte Klassen mithilfe von Funktion-Mixins dynamisch zu komponieren. Dies erlaubt modulare objektorientierte Architekturen, bei denen abstrakte Vorgaben über komponierte Klassenhierarchien vererbt werden.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;function WithTimestamp<TBase extends AbstractConstructor>(Base: TBase) {abstract class Timestamped extends Base {readonly createdAt: Date = new Date();abstract getMetadata(): Record<string, unknown>;}return Timestamped;}abstract class BaseEntity {abstract readonly id: string;}class UserEntity extends WithTimestamp(BaseEntity) {constructor(public readonly id: string, public readonly name: string) {super();}getMetadata() {return { id: this.id, name: this.name };}}
Erklärung
1
type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;
Deklariert eine Konstruktorsignatur, die mit abstrakten Klassenkonstruktoren kompatibel ist.
2
function WithTimestamp<TBase extends AbstractConstructor>(Base: TBase)
Definiert eine Mixin-Fabrik höherer Ordnung über einen abstrakten Basis-Konstruktor.
3
abstract class Timestamped extends Base
Erzeugt eine anonyme abstrakte Unterklasse, die die dynamische Basisklasse erweitert.
4
class UserEntity extends WithTimestamp(BaseEntity)
Instanziiert eine konkrete Klasse, die das vom Mixin generierte abstrakte Produkt erweitert.