Lekcje modułu (2/2)
Typy literalne i asercje
TypeScript oferuje zaawansowane narzędzia do ograniczania możliwych wartości zmiennych oraz do zmuszania kompilatora do rozpoznawania bardziej szczegółowych typów, gdy jest to konieczne.
Typy Literalowe / Dosłowne (Literal Types)
Typ literalny reprezentuje pojedynczą, ściśle określoną wartość (na przykład konkretny napis lub liczbę). Zazwyczaj są one łączone z uniami:
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;
light = 'red'; // OK
light = 'blue'; // Errore: "blue" non è assegnabile a TrafficLightAsercje Typu (as)
Czasami posiadasz informacje o typie, których TypeScript nie może pozyskać w czasie kompilacji. W takich przypadkach możesz użyć asercji typu za pomocą słowa kluczowego as:
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;Asercja mówi kompilatorowi: "Zaufaj mi, wiem, że ten element jest typu HTMLCanvasElement". Nie wykonuje ona żadnego sprawdzania ani rzutowania (castowania) w czasie wykonywania kodu (runtime) — służy wyłącznie do pomocy analizatorowi typów (type checker).
Asercje Const (as const)
Kiedy deklarujemy obiekt lub tablicę za pomocą słowa kluczowego const, TypeScript wciąż pozwala na modyfikowanie ich wewnętrznych właściwości. Dodając as const na końcu, zamrażamy całą strukturę i czynimy ją tylko do odczytu (readonly), konwertując wszystkie właściwości do ich dokładnych wartości literalnych:
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Errore: l'array è di sola lettura (readonly)Szablony typów tekstowych (Template Literal Types)
Szablony typów tekstowych opierają się na szablonach ciągów znaków (template strings) z JavaScriptu, ale służą do definiowania typów. Pozwalają one na łączenie wielu typów literalnych w jeden:
type Size = 'small' | 'large';
type Color = 'red' | 'blue';
// Crea l'unione: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;Narzędzia tekstowe w szablonach typów tekstowych
TypeScript oferuje specjalne typy pomocnicze (utility types) do manipulowania znakami wewnątrz szablonów typów tekstowych:
Capitalize<StringType>: Zamienia pierwszą literę ciągu znaków na wielką.Uncapitalize<StringType>: Zamienia pierwszą literę ciągu znaków na małą.Uppercase<StringType>: Konwertuje cały ciąg znaków na wielkie litery.Lowercase<StringType>: Konwertuje cały ciąg znaków na małe litery.
type ActionType = 'click' | 'hover';
// Genera: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;Spróbuj sam
Ćwiczenie 1: Unia wartości literalnych Direction
Zdefiniuj typ literalny o nazwie Direction, który akceptuje wyłącznie napisy 'up', 'down', 'left' lub 'right'. Następnie zadeklaruj funkcję o nazwie move(dir: Direction): string, która zwraca napis 'Moving ' po którym następuje otrzymany kierunek.
Pokaż wskazówkę
Zdefiniuj najpierw alias typu z czterema opcjami rozdzielonymi znakiem |, a następnie zadeklaruj funkcję move opisując parametr i typ zwracany.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie 2: Asercja na wyniku JSON.parse
Funkcja JSON.parse domyślnie zwraca typ any. Zmodyfikuj funkcję parseUser tak, aby wynik JSON.parse(json) był asertowany jako typ { username: string } przy użyciu słowa kluczowego as.
Pokaż wskazówkę
Dodaj 'as { username: string }' tuż po wywołaniu JSON.parse(json).
Rozwiązanie dostępne po 3 próbach
Ćwiczenie 3: Szablon typu tekstowego dla zdarzeń
Mając dane typy Status i Action, zdefiniuj szablon typu tekstowego o nazwie Event w formacie 'Status-Action' (na przykład 'open-click').
Pokaż wskazówkę
Użyj backticków (odwróconych apostrofów) do zdefiniowania typu oraz składni ${Status}-${Action} wewnątrz.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie 4: Szablon typu tekstowego z Capitalize
Zdefiniuj typ literalny Event, który może przyjąć wartość 'click' lub 'hover'. Następnie, użyj szablonów typów tekstowych (Template Literal Types), aby zadeklarować typ EventHandler reprezentujący ciągi znaków w formacie on, po którym następuje nazwa zdarzenia z wielką pierwszą literą (czyli 'onClick' o 'onHover').
Pokaż wskazówkę
Użyj Capitalize<Event> wewnątrz szablonu typu tekstowego, aby zamienić pierwszą literę zdarzenia na wielką.
Rozwiązanie dostępne po 3 próbach