In TypeScript (come in JavaScript moderno), le variabili possono essere dichiarate utilizzando let, const e var, e ci sono importanti differenze tra di esse:
Esempio:
if (true) { let a = 10; const b = 20; var c = 30; } console.log(c); // 30 — visibile al di fuori del blocco! console.log(a); // Errore: a non è definito console.log(b); // Errore: b non è definito
Scenari tipici:
const — per valori che non devono cambiare (costanti, configurazioni, riferimenti a funzioni).let — per valori che cambiano durante l'esecuzione (contatori, variabili in un ciclo).var — sconsigliato, solo per il supporto di codice obsoleto.Può
constrendere un oggetto completamente immutabile? Spiega, fornisci un esempio.
Risposta: No, const impedisce solo di cambiare il riferimento stesso, ma non protegge dalla modifica delle proprietà dell'oggetto!
const obj = { x: 1 }; obj.x = 2; // Questo è lecito! obj = { x: 3 }; // Errore: assegnazione di un nuovo riferimento
Per una completa immutabilità si utilizza Object.freeze:
const frozen = Object.freeze({ x: 1 }); frozen.x = 2; // Errore in modalità rigorosa, ma non sempre il compilatore avvisa!
Storia
Durante la migrazione di un grande progetto frontend a TypeScript, gli sviluppatori hanno sostituito massicciamente var con let, senza tenere conto che l'ambito di visibilità ora è limitato al blocco. Questo ha portato al fatto che i contatori in alcuni cicli for sono risultati inaccessibili al di fuori del ciclo, causando errori inaspettati nella logica: il codice ha smesso di funzionare quando si cercava di accedere al contatore del ciclo dopo il termine del ciclo.
Storia
Un sviluppatore ha dichiarato una costante tramite const per memorizzare un oggetto di configurazione, pensando che le proprietà fossero protette da modifiche. Successivamente, in un'altra parte del programma, è stata cambiata una proprietà: questo ha causato errori difficili da rilevare nel trattamento dei dati, poiché il codice esterno ha "inaspettatamente" modificato le impostazioni globali per tutti gli utenti.
Storia
Nel progetto sono stati utilizzati contemporaneamente let, const e var senza una chiara politica. Un componente ha ridefinito una variabile var all'interno di una funzione, mentre un'altra parte si aspettava che la variabile fosse dichiarata tramite let e quindi non sarebbe stata visibile al di fuori del blocco. Risultato: sovrapposizione di variabili, malfunzionamenti nella logica interna e difficoltà nell'eseguire il debug di problemi con il ciclo di vita delle variabili non ovvio.