Get und Set in TypeScript: Die Magie der Accessoren ohne Schmerz
\n\nHast du jemals eine Klasse in TypeScript geschrieben und gedacht: "Ich wünschte, ich könnte eine Eigenschaft intelligent machen, sodass sie beim Lesen etwas berechnet und beim Schreiben die Daten überprüft"? Dann lerne Getter (get) und Setter (set) kennen. Sie sind nicht nur syntaktischer Zucker, sondern ein mächtiges Werkzeug zur Kontrolle des Datenzugriffs.
\n\nWenn du dieses Thema bereits auf Stack Overflow gesehen hast, weißt du: Die Frage "get and set in TypeScript" sammelt tausende Aufrufe. Viele sind verwirrt, wann man Accessoren und wann normale Methoden verwendet. In diesem Artikel bringen wir Ordnung ins Chaos – von den Grundlagen bis zu kniffligen Details.
\n\nBereit? Los geht's!
\n\nWas sind get und set in TypeScript?
\n\nEin Getter ist eine Methode, die beim Lesen einer Eigenschaft aufgerufen wird. Ein Setter ist eine Methode, die beim Zuweisen eines Werts aufgerufen wird. Zusammen bilden sie Accessoren. Es sieht so aus, als würdest du mit einem normalen Feld arbeiten, aber unter der Haube steckt Logik.
\n\nHier ist ein minimales Beispiel:
\n\nclass User {\n private _name: string = '';\n\n get name(): string {\n return this._name;\n }\n\n set name(value: string) {\n if (value.length > 0) {\n this._name = value;\n } else {\n console.log('Der Name darf nicht leer sein');\n }\n }\n}\n\nconst user = new User();\nuser.name = 'Anna'; // setter wird aufgerufen\nconsole.log(user.name); // getter wird aufgerufen → 'Anna'\nuser.name = ''; // Versuch, einen leeren Namen zu setzen → Konsolenausgabe\n\nBeachte: Die Eigenschaft _name mit dem Präfix _ ist ein privates Feld. Ein direkter Zugriff von außen ist nicht möglich. Stattdessen verwenden wir den öffentlichen Accessor name.
Wozu braucht man Getter und Setter? 3 Hauptgründe
\n\n1. Datenvalidierung
\nDer Setter ist der ideale Ort, um Eingabewerte zu überprüfen. Du kannst ungültige Daten abfangen, bevor sie in das Objekt gelangen.
\n\nclass Temperature {\n private _celsius: number = 0;\n\n get celsius(): number {\n return this._celsius;\n }\n\n set celsius(value: number) {\n if (value < -273.15) {\n throw new Error('Temperatur unter dem absoluten Nullpunkt nicht möglich');\n }\n this._celsius = value;\n }\n}\n\n2. Berechnete Eigenschaften
\nEin Getter kann nicht nur einen gespeicherten Wert zurückgeben, sondern das Ergebnis von Berechnungen auf Basis anderer Daten.
\n\nclass Rectangle {\n constructor(public width: number, public height: number) {}\n\n get area(): number {\n return this.width * this.height;\n }\n\n get perimeter(): number {\n return 2 * (this.width + this.height);\n }\n}\n\nconst rect = new Rectangle(10, 5);\nconsole.log(rect.area); // 50 — wird dynamisch berechnet\n\n3. Kapselung und Zugriffskontrolle
\nDu kannst eine Eigenschaft schreibgeschützt (nur Getter) oder nur beschreibbar (nur Setter) machen. Das hilft, die OOP-Prinzipien einzuhalten.
\n\nclass Config {\n private _apiKey: string = 'secret123';\n\n get apiKey(): string {\n // Hier könnte man Logging oder Berechtigungsprüfungen einfügen\n return this._apiKey;\n }\n // Kein Setter definiert – Eigenschaft ist schreibgeschützt\n}\n\nconst config = new Config();\nconsole.log(config.apiKey); // 'secret123'\n// config.apiKey = 'newKey'; // Kompilierungsfehler!\n\nHäufige Fragen zu get und set in TypeScript
\n\nLass uns die Fragen durchgehen, die Anfänger (und nicht nur sie) am häufigsten auf Stack Overflow und in Foren stellen.
\n\nFrage 1: Wie unterscheiden sich get/set von normalen Methoden?
\nDer Hauptunterschied ist die Syntax beim Aufruf. Accessoren sehen aus wie Eigenschaften: ohne runde Klammern. Das macht den Code sauberer und intuitiver. Vergleiche:
\n\n// Mit Methoden\nuser.getName();\nuser.setName('Peter');\n\n// Mit Accessoren\nuser.name;\nuser.name = 'Peter';\n\nEin zweiter Unterschied: Accessoren können nicht überladen (overload) werden. Jeder Accessor hat nur eine Signatur.