Słowo kluczowe readonly w TypeScript jest stosowane dla właściwości obiektów i tablic, aby zabronić ich modyfikacji po inicjalizacji:
readonly stosowane jest tylko do właściwości obiektów, a nie do zmiennych.const, który wskazuje, że zmienna nie może być ponownie przypisana, ale nie zabrania zmiany zawartości obiektu, readonly rzeczywiście zabrania modyfikacji samego pola lub elementu tablicy.Przykład:
interface User { readonly id: number; name: string; } const user: User = { id: 1, name: 'Anna' }; user.id = 2; // Błąd: Cannot assign to 'id' because it is a read-only property.
Dla tablic:
const nums: readonly number[] = [1, 2, 3]; nums.push(4); // Błąd: Property 'push' does not exist on type 'readonly number[]'.
Jaka jest różnica między
constareadonlyw TypeScript? Czy mogą się nawzajem zastępować?
Odpowiedź: Nie, nie mogą. const to ograniczenie dotyczące samej zmiennej (nie można ponownie przypisać), a readonly to ograniczenie dotyczące poszczególnych właściwości obiektu lub elementów tablicy, ale sama zmienna może być zmieniana (jeśli jest to dozwolone kontekstem).
Przykład:
const arr: readonly number[] = [1, 2, 3]; // arr = [2, 3, 4]; // Błąd z powodu const // arr[0] = 5; // Błąd z powodu readonly
Historia
Na projekcie finansowej platformy, podczas pracy z danymi użytkowników, używano zwykłych tablic number[] zamiast readonly number[]. Z tego powodu jedna funkcja niechcący zmieniła dane wejściowe — wartości sum w tablicach były używane w różnych miejscach, co doprowadziło do rozbieżności w raportach. Błąd został zauważony po kilku dniach, co kosztowało firmę czas na audyt i przywracanie danych.
Historia
W wewnętrznym API pomylono const i readonly, sądząc, że const user: User zapobiegnie zmianie pól. W rezultacie okazało się, że możliwe jest zmienianie pól obiektu, chociaż było to niedopuszczalne według specyfikacji. Z powodu niewiedzy o różnicy wystąpiły wycieki poufnych danych między usługami.
Historia
W ramach biblioteki open source jedną z struktur danych przypadkowo uczyniono mutowalną, ponieważ zapomniano o readonly w definicji interfejsu. To pozwoliło zewnętrznym deweloperom na zmianę prywatnych danych w czasie działania, co spowodowało błędy, których naprawa wymagała refaktoryzacji.