Zwei Seiten einer Medaille: Funktionaler und OOP-Ansatz in TypeScript
\n\nDie Welt von TypeScript ist ein erstaunlicher Ort, an dem sich die besten Praktiken aus verschiedenen Welten vermischen. Haben Sie sich jemals gefragt, warum einige Entwickler Code mit Klassen und Vererbung schreiben, während andere reine Funktionen und Komposition verwenden? Und vor allem: Welcher Ansatz bringt Ihrem Projekt den größten Nutzen?
\n\nIn diesem Artikel werden wir nicht darüber diskutieren, was besser ist. Wir analysieren funktionale Programmierung vs. objektorientierte Programmierung in TypeScript anhand realer Beispiele. Sie erfahren, wann Sie Klassen und wann Funktionen höherer Ordnung einsetzen sollten und wie Sie in der modernen Entwicklung die goldene Mitte finden.
\n\nWas ist funktionale Programmierung in TypeScript?
\n\nFunktionale Programmierung (FP) ist ein Paradigma, bei dem reine Funktionen die grundlegenden Bausteine sind. Sie verändern keinen externen Zustand und liefern für dieselben Eingabedaten immer dasselbe Ergebnis. TypeScript unterstützt FP dank strenger Typisierung und der Möglichkeit, Funktionen als Daten zu behandeln, hervorragend.
\n\nGrundprinzipien der FP in TypeScript
\n- \n
- Unveränderlichkeit (Immutability) – Daten werden nicht verändert, sondern neu erstellt \n
- Reine Funktionen – keine Seiteneffekte \n
- Komposition – komplexes Verhalten aus einfachen Funktionen zusammensetzen \n
- Funktionen höherer Ordnung – Funktionen, die andere Funktionen entgegennehmen oder zurückgeben \n
// Beispiel für reine Funktionen und Unveränderlichkeit in TypeScript\ntype User = {\n readonly id: number;\n readonly name: string;\n readonly age: number;\n};\n\nconst addYear = (user: User): User => ({\n ...user,\n age: user.age + 1\n});\n\nconst users: User[] = [\n { id: 1, name: 'Alice', age: 25 },\n { id: 2, name: 'Bob', age: 30 }\n];\n\n// Keine Mutationen – wir erstellen ein neues Array\nconst updatedUsers = users.map(addYear);\nconsole.log(users[0].age); // 25 (Original wurde nicht geändert)\nconsole.log(updatedUsers[0].age); // 26\n\n\nBeachten Sie readonly – ein mächtiges Werkzeug von TypeScript, das hilft, Unveränderlichkeit auf Typebene einzuhalten.
Was ist objektorientierte Programmierung in TypeScript?
\n\nOOP baut auf Objekten auf, die Daten und Verhalten vereinen. TypeScript fügt JavaScript klassische Vererbung, Zugriffsmodifikatoren und Interfaces hinzu und macht OOP noch ausdrucksstärker.
\n\nGrundprinzipien der OOP in TypeScript
\n- \n
- Kapselung – Verbergen des internen Zustands durch
privateundprotected\n - Vererbung – Erstellen von Klassenhierarchien \n
- Polymorphismus – Einheitliche Schnittstelle für verschiedene Implementierungen \n
- Abstraktion – Arbeiten über Interfaces, nicht über konkrete Klassen \n
// Beispiel für den OOP-Ansatz in TypeScript\nabstract class Animal {\n constructor(protected name: string) {}\n\n abstract makeSound(): string;\n\n public introduce(): string {\n return `I am ${this.name}, and I say ${this.makeSound()}`;\n }\n}\n\nclass Dog extends Animal {\n constructor(name: string) {\n super(name);\n }\n\n public makeSound(): string {\n return 'Woof!';\n }\n}\n\nclass Cat extends Animal {\n constructor(name: string) {\n super(name);\n }\n\n public makeSound(): string {\n return 'Meow!';\n }\n}\n\nconst animals: Animal[] = [new Dog('Rex'), new Cat('Whiskers')];\nanimals.forEach(a => console.log(a.introduce()));\n// I am Rex, and I say Woof!\n// I am Whiskers, and I say Meow!\n\n\nHier sind abstract und protected TypeScript-Features, die es in normalem JavaScript nicht gibt. Sie ermöglichen den Aufbau einer strengen Architektur direkt auf Typebene.
Vergleich der Ansätze: Wann verwendet man was?
\n\nLassen Sie uns einige