Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 2 z 210/14 w kursie~15 min
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:

TS
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;

light = 'red'; // OK
light = 'blue'; // Errore: "blue" non è assegnabile a TrafficLight

Asercje 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:

TS
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:

TS
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:

TS
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.
TS
type ActionType = 'click' | 'hover';

// Genera: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;

Spróbuj sam

Ćwiczenie 1: Unia wartości literalnych Direction

Ćwiczenie#ts.m5.l2.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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

Ćwiczenie#ts.m5.l2.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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ń

Ćwiczenie#ts.m5.l2.e3
Próby: 0Ładowanie...

Mając dane typy Status i Action, zdefiniuj szablon typu tekstowego o nazwie Event w formacie 'Status-Action' (na przykład 'open-click').

Ładowanie edytora...
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

Ćwiczenie#ts.m5.l2.e4
Próby: 0Ładowanie...

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').

Ładowanie edytora...
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