Einleitung: Warum meckert TypeScript Ihre Eigenschaften an?
Sie schreiben Code in TypeScript, alles läuft super... Und plötzlich – bumm! Eine rote Wellenlinie unter einer Klasseneigenschaft, und der Compiler gibt Ihnen den eiskalten Satz: Property '...' has no initializer and is not definitely assigned in the constructor. Kommt Ihnen bekannt vor? Wenn Sie jemals mit Angular, React oder einfach nur mit TypeScript-Klassen gearbeitet haben – dann sehr wahrscheinlich.
Dieser Fehler ist einer der beliebtesten auf Stack Overflow (tausende Aufrufe, dutzende Antworten). Aber die gute Nachricht: Er ist nicht schlimm. Die schlechte Nachricht: Wenn Sie ihn nicht verstehen, können Sie mit Laufzeitfehlern viel kaputt machen. In diesem Artikel analysieren wir, warum dieser TypeScript-Fehler auftritt, wie man ihn behebt und wann welche Lösung angemessen ist.
Was bedeutet der Fehler "Property has no initializer"?
Übersetzen wir vom Compiler-Deutsch ins Menschliche. TypeScript sagt Ihnen: "Hey, du hast eine Eigenschaft in einer Klasse deklariert, ihr aber keinen Anfangswert gegeben und sie auch nicht im Konstruktor zugewiesen. Ich bin mir nicht sicher, ob dort etwas Sinnvolles steht, wenn du auf diese Eigenschaft zugreifst."
Aktivieren Sie strict: true in Ihrer tsconfig.json – und Sie aktivieren automatisch das Flag strictPropertyInitialization. Genau dieses ist für diese Prüfung verantwortlich. Der Code sieht dann ungefähr so aus:
class User { name: string; // ❌ Fehler! age: number; // ❌ Fehler!}TypeScript stellt zu Recht fest: name und age könnten undefined sein, wenn Sie vergessen, sie zu initialisieren. Aber ihr Typ ist streng string und number, ohne undefined. Da haben wir den Konflikt.
Methode Nr. 1: Initialisierung direkt in der Deklaration
Der einfachste und sicherste Weg – geben Sie der Eigenschaft sofort einen Wert. Das ist besonders praktisch für Felder mit Standardwerten.
class User { name: string = 'Gast'; age: number = 0; createdAt: Date = new Date();}Wann verwenden: Wenn das Feld einen sinnvollen Standardwert hat. Zum Beispiel ein Zähler, ein Flag, ein Erstellungsdatum. Das ist die beste TypeScript-Praxis – Sie geben den Anfangszustand explizit an.
Methode Nr. 2: Initialisierung im Konstruktor
Der Klassiker. Wenn der Wert von außen kommen soll – weisen Sie ihn im Konstruktor zu. TypeScript stimmt dem zu.
class User { name: string; age: number;
constructor(name: string, age: number) { this.name = name; this.age = age; }}Wichtig: Der Compiler prüft, ob Sie allen Eigenschaften einen Wert zugewiesen haben. Wenn Sie eine vergessen – wieder ein Fehler.
class User { name: string; age: number;
constructor(name: string) { this.name = name; // age nicht zugewiesen – Fehler! }}Das ist Absicht: TypeScript schützt Sie vor versehentlichem undefined. Sie initialisieren entweder alle Felder oder erlauben explizit, dass sie undefiniert sein dürfen.
Methode Nr. 3: Der definite assignment Operator (!)
Manchmal wissen Sie genau, dass eine Eigenschaft später initialisiert wird, aber nicht im Konstruktor. Zum Beispiel durch Dependency Injection in Angular oder durch den Aufruf einer asynchronen Methode. Dann verwenden Sie die definite assignment assertion – ein Ausrufezeichen nach dem Eigenschaftsnamen.
class UserService { user!: User; // OK, ich verspreche, dass es einen Wert haben wird
constructor() { this.initUser(); }
initUser() { this.user = new User('Alice', 30); }}Achtung: Das ist ein mächtiges, aber gefährliches Werkzeug. Sie sagen TypeScript: "Prüfe nicht, ich weiß, was ich tue". Wenn Sie vergessen, die Eigenschaft zu initialisieren, erhalten Sie zur Laufzeit undefined. Verwenden Sie es nur, wenn Sie zu 100% sicher sind.
Methode Nr. 4: Die Eigenschaft optional machen (?)
Wenn