Das Schlüsselwort readonly in TypeScript wird für Eigenschaften von Objekten und Arrays verwendet, um deren Änderung nach der Initialisierung zu verbieten:
readonly wird nur für die Eigenschaften von Objekten angewendet, nicht für Variablen.const, welches angibt, dass eine Variable nicht neu zugewiesen werden kann, aber nicht verbietet, den Inhalt eines Objekts zu ändern, verbietet readonly die Modifikation des eigentlichen Feldes oder Elements des Arrays.Beispiel:
interface User { readonly id: number; name: string; } const user: User = { id: 1, name: 'Anna' }; user.id = 2; // Fehler: Cannot assign to 'id' because it is a read-only property.
Für Arrays:
const nums: readonly number[] = [1, 2, 3]; nums.push(4); // Fehler: Property 'push' does not exist on type 'readonly number[]'.
Was ist der Unterschied zwischen
constundreadonlyin TypeScript? Können sie sich gegenseitig ersetzen?
Antwort: Nein, können sie nicht. const ist eine Einschränkung für die Variable selbst (nicht neu zuweisen), während readonly eine Einschränkung für bestimmte Eigenschaften eines Objekts oder Elemente eines Arrays ist, aber die Variable selbst kann modifiziert werden (wenn es der Kontext erlaubt).
Beispiel:
const arr: readonly number[] = [1, 2, 3]; // arr = [2, 3, 4]; // Fehler wegen const // arr[0] = 5; // Fehler wegen readonly
Geschichte
In einem Projekt für eine Finanzplattform wurden beim Arbeiten mit Benutzerdaten normale Arrays number[] anstelle von readonly number[] verwendet. Dies führte dazu, dass eine Funktion versehentlich die Eingabedaten änderte – die Werte in den Arrays wurden an verschiedenen Stellen verwendet, was zu abweichenden Berichten führte. Der Fehler wurde erst nach einigen Tagen entdeckt, was das Unternehmen Zeit für eine Überprüfung und Wiederherstellung der Daten kostete.
Geschichte
In einer internen API wurden const und readonly verwechselt, da man dachte, dass const user: User die Änderung der Felder verhindern würde. Infolgedessen war es möglich, die Felder des Objekts zu ändern, obwohl dies im Lastenheft nicht zulässig war. Aufgrund des Unwissens über den Unterschied kam es zu Datenschutzverletzungen zwischen den Diensten.
Geschichte
In einer Open-Source-Bibliothek wurde eine der Datenstrukturen versehentlich veränderbar gemacht, weil man readonly in der Schnittstellendefinition vergaß. Dies ermöglichte es Dritten, private Daten zur Laufzeit zu ändern, was zu Fehlern führte, deren Behebung Refactoring erforderte.