La parola chiave readonly in TypeScript viene utilizzata per le proprietà degli oggetti e degli array, per vietare la loro modifica dopo l'inizializzazione:
readonly si applica solo alle proprietà degli oggetti, e non alle variabili.const, che indica che una variabile non può essere riassegnata, ma non impedisce di modificare il contenuto di un oggetto, readonly vieta proprio la modifica del campo o dell'elemento dell'array.Esempio:
interface User { readonly id: number; name: string; } const user: User = { id: 1, name: 'Anna' }; user.id = 2; // Errore: Impossibile assegnare a 'id' perché è una proprietà di sola lettura.
Per gli array:
const nums: readonly number[] = [1, 2, 3]; nums.push(4); // Errore: La proprietà 'push' non esiste sul tipo 'readonly number[]'.
Qual è la differenza tra
constereadonlyin TypeScript? Possono sostituirsi a vicenda?
Risposta: No, non possono. const è una restrizione sulla variabile stessa (non può essere riassegnata), mentre readonly è una restrizione su singole proprietà di un oggetto o elementi di un array, ma la variabile stessa può essere modificata (se consentito dal contesto).
Esempio:
const arr: readonly number[] = [1, 2, 3]; // arr = [2, 3, 4]; // Errore a causa di const // arr[0] = 5; // Errore a causa di readonly
Storia
In un progetto per una piattaforma finanziaria, durante il lavoro con i dati degli utenti, sono stati utilizzati array normali number[] invece di readonly number[]. A causa di ciò, una funzione ha inavvertitamente modificato i dati in ingresso — i valori delle somme negli array venivano utilizzati in diversi luoghi, portando a discrepanze nei rapporti. L'errore è stato scoperto dopo alcuni giorni, il che è costato all'azienda tempo per audit e recupero dei dati.
Storia
Nell'API interna, si sono confusi const e readonly, pensando che const user: User avrebbe impedito la modifica dei campi. Di conseguenza, è stato possibile modificare i campi dell'oggetto, anche se ciò non è consentito dal progetto. A causa della mancanza di conoscenza della differenza, si sono verificate perdite di dati riservati tra i servizi.
Storia
All'interno di una libreria open source, una delle strutture dati è stata accidentalmente resa modificabile, perché è stata dimenticata la parola readonly nella definizione dell'interfaccia. Questo ha consentito a sviluppatori esterni di modificare dati privati in fase di esecuzione, causando bug che hanno richiesto refactoring per essere risolti.