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
const d = 'lewo'; // ma typ 'lewo' (typ literału) let e = 'lewo'; // ma typ string (zwykły)
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ź:
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).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
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.