W TypeScript (jak i w nowoczesnym JavaScript) zmienne można deklarować z użyciem let, const i var, pomiędzy którymi istnieją istotne różnice:
Przykład:
if (true) { let a = 10; const b = 20; var c = 30; } console.log(c); // 30 — widoczna poza blokiem! console.log(a); // Błąd: a is not defined console.log(b); // Błąd: b is not defined
Typowe scenariusze:
const — dla wartości, które nie powinny się zmieniać (stałe, ustawienia, odwołania do funkcji).let — dla wartości, które zmieniają się podczas wykonywania (liczniki, zmienne w pętli).var — używać niezalecane, tylko dla wsparcia starszego kodu.Czy
constmoże uczynić obiekt całkowicie niemutowalnym? Wyjaśnij, podaj przykład.
Odpowiedź: Nie, const zapobiega jedynie zmianom samego odwołania, ale nie chroni przed zmianami właściwości obiektu!
const obj = { x: 1 }; obj.x = 2; // To jest dozwolone! obj = { x: 3 }; // Błąd: przypisanie nowego odwołania
Dla pełnej niemutowalności używaj Object.freeze:
const frozen = Object.freeze({ x: 1 }); frozen.x = 2; // Błąd w trybie ścisłym, ale nie zawsze kompilator ostrzega!
Historia
W trakcie migracji dużego projektu frontendowego do TypeScript programiści masowo zastąpili var przez let, nie uwzględniając, że zakres widoczności stał się blokowy. Doprowadziło to do tego, że liczniki w niektórych pętlach for stały się niedostępne poza pętlą, co spowodowało nieoczekiwane błędy w logice: kod przestał działać przy próbach odwołania się do licznika pętli po zakończeniu pętli.
Historia
Programista zadeklarował stałą przez const w celu przechowywania obiektu konfiguracyjnego, sądząc, że właściwości są chronione przed zmianami. Później w czasie wykonywania inna część programu zmieniła właściwość: spowodowało to trudne do namierzenia błędy w przetwarzaniu danych, ponieważ zewnętrzny kod "nieoczekiwanie" zmienił globalne ustawienia dla wszystkich użytkowników.
Historia
W projekcie jednocześnie używano let, const i var bez wyraźnej polityki. Jeden komponent ponownie zadeklarował zmienną var w ramach funkcji, podczas gdy inna część oczekiwała, że zmienna została zadeklarowana przez let, a zatem na zewnątrz bloku nie będzie widoczna. Efekt: nakładanie się zmiennych, awarie wewnętrznej logiki i trudne debugowanie problemów z nieoczywistym cyklem życia zmiennych.