Event-driven Architektur mit TypeScript: flexiblen Code mit Events schreiben

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Event-driven Architektur mit TypeScript: Wenn Code einander „hört“

\n\n

Stellen Sie sich vor, Sie schreiben eine komplexe Webanwendung: einen Messenger, einen Trading-Bot oder ein Server-Überwachungssystem. Irgendwann merken Sie: Funktionen einfach in einer Kette aufzurufen – das ist die Hölle. Ein Modul zieht das nächste mit, das dritte hängt am vierten, und bei einer Logikänderung fällt alles wie ein Kartenhaus zusammen.

\n\n

Kommt Ihnen das bekannt vor? Dann brauchen Sie eine Event-driven Architektur mit TypeScript. Das ist nicht nur ein modischer Begriff, sondern eine echte Möglichkeit, Code flexibel, erweiterbar und verständlich zu machen. In diesem Artikel schauen wir uns an, wie ereignisorientierte Programmierung funktioniert, schreiben unseren eigenen Event-Bus in TypeScript und sehen, wo das wirklich weiterhilft.

\n\n

Was ist Event-driven Architektur einfach erklärt

\n\n

Event-driven Architektur (ereignisorientierte Architektur) ist ein Ansatz, bei dem Komponenten eines Systems über Ereignisse kommunizieren. Ein Modul erzeugt ein Ereignis (z. B. „Benutzer hat sich registriert“), und andere abonnieren es und reagieren darauf. Sie sind nicht direkt miteinander verbunden.

\n\n

Klingt abstrakt? Nehmen wir ein Beispiel aus dem Leben. Stellen Sie sich ein Büro vor:

\n
    \n
  • Traditioneller Ansatz: Der Chef geht persönlich zu jedem Mitarbeiter und sagt: „Erstelle einen Bericht.“
  • \n
  • Event-driven: Der Chef ruft: „Ein Bericht wird benötigt!“ – und alle, die ihn erstellen können, machen sich selbst an die Arbeit.
  • \n
\n\n

Im zweiten Fall muss der Chef nicht wissen, wer genau den Bericht erstellt. Er sendet einfach ein Ereignis. Und die Mitarbeiter können sich an- und abmelden, ohne die Logik des Chefs zu ändern. Das ist die Essenz der ereignisorientierten Programmierung.

\n\n

Warum TypeScript ideal für die Event-Architektur ist

\n\n

JavaScript ist an sich schon ereignisorientiert (denken Sie an addEventListener), aber in großen Projekten führt das Fehlen von Typen zu Chaos. TypeScript Events lösen dieses Problem: Sie wissen genau, welche Daten in einem Ereignis ankommen, und der Compiler fängt Fehler bereits in der Entwicklungsphase, nicht erst zur Laufzeit.

\n\n

Außerdem unterstützt TypeScript Generics, Überladungen und strenge Typisierung von Callbacks – alles, was für die Erstellung eines zuverlässigen Event-Bus benötigt wird.

\n\n

Einen Event Bus in TypeScript von Grund auf schreiben

\n\n

Beginnen wir mit einem einfachen, aber funktionsfähigen Beispiel. Wir erstellen eine Klasse EventBus – die zentrale Ereignis-Bus, über die alle Module kommunizieren.

\n\n
// event-bus.ts\ntype EventHandler<T = any> = (data: T) => void;\n\nclass EventBus {\n  private handlers: Map<string, EventHandler[]> = new Map();\n\n  // Abonnieren eines Ereignisses\n  on<T>(event: string, handler: EventHandler<T>): void {\n    if (!this.handlers.has(event)) {\n      this.handlers.set(event, []);\n    }\n    this.handlers.get(event)!.push(handler as EventHandler);\n  }\n\n  // Abbestellen eines Ereignisses\n  off(event: string, handler: EventHandler): void {\n    const handlers = this.handlers.get(event);\n    if (handlers) {\n      this.handlers.set(event, handlers.filter(h => h !== handler));\n    }\n  }\n\n  // Auslösen eines Ereignisses\n  emit<T>(event: string, data: T): void {\n    const handlers = this.handlers.get(event);\n    if (handlers) {\n      handlers.forEach(handler => handler(data));\n    }\n  }\n}\n\nexport const globalEventBus = new EventBus();
\n\n

Damit haben wir eine einfache Event-driven Architektur mit TypeScript geschrieben. Jetzt kann jedes Modul globalEventBus importieren und entweder Ereignisse abhören oder sie auslösen.

\n\n

Anwendungsbeispiel: Benachrichtigungen und Logging

\n\n

Stellen wir uns vor, wir haben ein Authentifizierungsmodul und ein Benachrichtigungsmodul. Sie sollten nichts direkt voneinander wissen.

\n\n
// auth-module.ts\nimport { globalEventBus } from './event-bus';\n\nexport function loginUser(email: string): void {\n  // ... Anmeldelogik\n  console.log(`Benut                

Blogs

Buchempfehlungen