programowanieProgramista TypeScript

Co to są typy literałów w TypeScript i do czego są używane? Jak za ich pomocą można wprowadzić ścisłe ograniczenia dla wartości zmiennych i jakie pułapki mogą się pojawić przy ich stosowaniu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

Typy literałów pozwalają ograniczyć możliwe wartości zmiennej do określonych stałych, a nie tylko ogólnego typu (na przykład, nie po prostu liczba, ale liczba 5 lub ciąg "tak").

Jest to przydatne do tworzenia API z ustalonymi parametrami, statusami itd.

type Direction = 'lewo' | 'prawo' | 'góra' | 'dół'; function move(dir: Direction) { // ... } move('lewo'); // OK move('góra'); // Błąd kompilacji!

Działa to również z liczbami, booleanami, a nawet całymi strukturami (typy literałów krotek):

type WeekDay = 1 | 2 | 3 | 4 | 5 | 6 | 7; const day: WeekDay = 6; // OK

Ograniczenia i niuanse:

  • Do typów literałów nie można niejawnie przypisywać wartości (na przykład, nie można przypisać zmiennej typu 'lewo' | 'prawo' ciągu od użytkownika bez sprawdzenia).
  • Przy pracy z stałymi i zmiennymi let ważne jest, aby pamiętać o typie wyjściowym:
const d = 'lewo'; // ma typ 'lewo' (typ literału) let e = 'lewo'; // ma typ string (zwykły)

Pytanie z pułapką

Pytanie: Jaki typ otrzyma zmienna, jeśli zdefiniujemy ją jako const x = "tak"; — i czy można będzie później przypisać jej inną wartość ciągu tekstowego?

Odpowiedź:

  • Jeśli zadeklarujemy const x = "tak"; — x będzie miała typ "tak" (typ literału), i nie będzie można jej przypisać żadnej innej wartości, oprócz 'tak' (a nie można jej zmienić, ponieważ jest to const).
  • Jeśli zadeklarujemy let x = "tak";, to x będzie typowana jako string, i można będzie przypisywać dowolne ciągi tekstowe.
const x = 'tak'; // x: 'tak' let y = 'tak'; // y: string

Przykłady rzeczywistych błędów spowodowanych niewiedzą o szczegółach tematu.


Historia

W projekcie do statusów zadań używano enum, ale programista zastąpił go stringiem. W wyniku tego API zaczęło akceptować dowolne ciągi jako status, co spowodowało wiele błędów przy rozwijaniu produktu w produkcji, ponieważ kontrola została utracona.


Historia

Programista próbował użyć typów literałów do walidacji danych, ale przypisywał parametry z pola formularza bezpośrednio — TS pozwolił to zrobić, ponieważ typ pola input był stringiem, a nie literałem (na przykład, "ok" | "fail"), ponieważ wartości input nie były sprawdzane. W efekcie w czasie wykonania pojawiały się wartości spoza dopuszczalnego zbioru.


Historia

Podczas pisania testów dla funkcji, która przyjmowała wartości literałów, automatycznie wygenerowany test przypadkowo podał nieoczekiwany parametr ciągu, testy nie przeszły. Później okazało się, że typowanie zostało osłabione z powodu nieuwagi przy wyjściu typów przy zadeklarowanej zmiennej let, co nie wykrył kompilator.