TypeScript przez długi czas pozwalał na określanie typów literałów dla pojedynczych wartości ciągów lub liczb, jednak wraz z pojawieniem się literałów szablonowych pojawiła się potrzeba typizacji konkretnej struktury ciągów. Typy literałów szablonowych umożliwiają definiowanie typów opartych na szablonowym łączeniu ciągów, co zapewnia statyczną walidację struktury wartości ciągów.
Nie można sprawdzić zgodności ciągu z określonym formatem (na przykład 'user_42') za pomocą zwykłych typów string — są one zbyt ogólne. Bez typów szablonowych kompilator nie może zagwarantować, że ciąg będzie odpowiadał ściśle określonemu wzorcowi.
Typy literałów szablonowych pozwalają na tworzenie złożonych typów ciągów w czasie kompilacji i zapewniają ścisłą kontrolę ich zgodności z określonymi szablonami.
Przykład kodu:
type UserId = `user_${number}`; function loadUser(id: UserId) { // ... } loadUser('user_123'); // poprawne loadUser('admin_123'); // błąd kompilacji
Kluczowe cechy:
Czy można używać typów literałów szablonowych tylko z number/literal? Czy można używać własnych literałów ciągów w szablonie?
Można używać dowolnych typów literałów — ciągów, liczb, złącz:
type EventType = `event_${'click' | 'hover'}`; // event_click | event_hover
Czy można przekazać zwykły ciąg, gdy funkcja oczekuje typu literału szablonu?
Nie, jeśli typ wyraźnie oczekuje literału-szablonu, po prostu string nie zadziała:
function handler(type: `btn_${string}`) {} handler('btn_click'); // ok handler('button'); // błąd kompilacji
Czy typy literałów szablonowych działają z mapped types i keyof?
Tak, typy literałów szablonowych świetnie łączą się z mapped types i kluczami obiektów:
const colors = {red: 1, blue: 2}; type ColorKey = keyof typeof colors; type ColorClass = `color-${ColorKey}`; // color-red | color-blue
API przyjmuje identyfikatory w formacie 'user_XXX', funkcja nie jest typowana — można przekazać dowolny ciąg, co w przypadku błędu na serwerze powoduje błędy.
Zalety:
Wady:
Używany jest typ UserId = user_${number}, przed kompilacją gwarantowana jest poprawność argumentów funkcji i bezpieczne zapytania do serwera.
Zalety:
Wady: