Vai al contenuto
eLearner.app
Modulo 5 · Lezione 2 di 210/14 nel corso~15 min
Lezioni del modulo (2/2)

Tipi Letterali e Asserzioni

TypeScript offre strumenti avanzati per restringere i possibili valori delle variabili e per forzare il compilatore a riconoscere tipi più specifici quando necessario.

Tipi Letterali (Literal Types)

Un tipo letterale rappresenta un singolo valore preciso (ad esempio, una specifica stringa o un numero). Di solito vengono combinati con le unioni:

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

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

Asserzioni di Tipo (as)

A volte disponi di informazioni su un tipo che TypeScript non può conoscere a tempo di compilazione. In questi casi, puoi usare un'asserzione di tipo tramite la parola chiave as:

TS
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;

L'asserzione dice al compilatore: "Fidati di me, so che questo elemento è un HTMLCanvasElement". Non esegue alcun controllo o cast a runtime; serve solo ad aiutare il type checker.

Asserzioni Const (as const)

Quando dichiariamo un oggetto o un array con const, TypeScript permette comunque di modificarne le proprietà interne. Aggiungendo as const alla fine, l'intera struttura viene congelata e resa di sola lettura, convertendo tutte le proprietà nei loro tipi letterali esatti:

TS
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Errore: l'array è di sola lettura (readonly)

Tipi Stringa Template (Template Literal Types)

I tipi stringa template si basano sulle stringhe template di JavaScript, ma vengono usati per definire tipi. Consentono di combinare più tipi letterali in uno solo:

TS
type Size = 'small' | 'large';
type Color = 'red' | 'blue';

// Crea l'unione: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;

Utility Stringhe nei Template Literal Types

TypeScript offre dei tipi di utilità speciali per manipolare i caratteri all'interno dei Template Literal Types:

  • Capitalize<StringType>: Rende maiuscola la prima lettera della stringa.
  • Uncapitalize<StringType>: Rende minuscola la prima lettera della stringa.
  • Uppercase<StringType>: Converte tutta la stringa in maiuscolo.
  • Lowercase<StringType>: Converte tutta la stringa in minuscolo.
TS
type ActionType = 'click' | 'hover';

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

Prova tu

Esercizio 1: Unione di Letterali Direction

Esercizio#ts.m5.l2.e1
Tentativi: 0Caricamento…

Definisci un tipo letterale chiamato Direction che accetta solo le stringhe 'up', 'down', 'left' o 'right'. Dichiara poi una funzione chiamata move(dir: Direction): string che restituisce la stringa 'Moving ' seguita dalla direzione ricevuta.

Caricamento editor…
Mostra suggerimento

Definisci prima il type alias con le quattro opzioni separate da |, poi dichiara la funzione move annotando il parametro e il ritorno.

Soluzione disponibile dopo 3 tentativi

Esercizio 2: Asserzione su JSON.parse

Esercizio#ts.m5.l2.e2
Tentativi: 0Caricamento…

La funzione JSON.parse restituisce per impostazione predefinita il tipo any. Modifica la funzione parseUser in modo che il risultato di JSON.parse(json) sia asserito come tipo { username: string } usando la parola chiave as.

Caricamento editor…
Mostra suggerimento

Aggiungi 'as { username: string }' subito dopo la chiamata a JSON.parse(json).

Soluzione disponibile dopo 3 tentativi

Esercizio 3: Template Literal per Eventi

Esercizio#ts.m5.l2.e3
Tentativi: 0Caricamento…

Dati i tipi Status e Action, definisci un tipo stringa template chiamato Event nel formato 'Status-Action' (ad esempio, 'open-click').

Caricamento editor…
Mostra suggerimento

Usa i backtick per definire il tipo e la sintassi ${Status}-${Action} all'interno.

Soluzione disponibile dopo 3 tentativi

Esercizio 4: Template Literal Type con Capitalize

Esercizio#ts.m5.l2.e4
Tentativi: 0Caricamento…

Definisci un tipo letterale Event che può essere 'click' o 'hover'. Dopodiché, usa i Template Literal Types per dichiarare un tipo EventHandler che rappresenta le stringhe nel formato on seguito dal nome dell'evento con l'iniziale maiuscola (ovvero 'onClick' o 'onHover').

Caricamento editor…
Mostra suggerimento

Usa Capitalize<Event> all'interno del template literal per rendere maiuscola la prima lettera dell'evento.

Soluzione disponibile dopo 3 tentativi