Vai al contenuto
eLearner.app

Fine del Corso TypeScript

Riepilogo e sfida finale

Complimenti! Hai attraversato i 5 moduli del Corso TypeScript — dalle annotazioni elementari e i tipi primitivi fino alla programmazione robusta con Interfacce, Unioni, i versatili Generics, le Classi/Utility Types e i Tipi Avanzati/Guardie. Qui sotto trovi la mappa delle competenze acquisite e una sfida finale in cinque tappe.

Promemoria: gli esercizi TypeScript si verificano staticamente (parole chiave). Per eseguire il codice davvero, ogni esercizio offre il bottone TypeScript Playground che copia il codice e apre typescriptlang.org/play.

01 · Fondamenti

  • annotazioni
  • tipi primitivi
  • esplicito vs implicito
  • array string[] / number[]
  • tuple fisse

02 · Tipi e Interfacce

  • interface
  • type alias
  • campi opzionali ?
  • union types |
  • type narrowing (typeof)

03 · Generics e Funzioni

  • funzioni tipizzate
  • parametri opzionali
  • firme di tipo
  • generics <T>
  • classi e box generici

04 · Classi e Utility Types

  • classi e costruttori
  • modificatori private/public
  • implementazione interfacce
  • utility types (Partial, Omit)
  • gestione dell'invisibilità

05 · Tipi Avanzati e Guardie

  • guardie di tipo
  • is operator
  • typeof / instanceof
  • tipi letterali
  • asserzioni as / as const
  • template literal types

La sfida finale, in cinque tappe

Metti insieme ciò che hai imparato su TypeScript realizzando cinque piccoli componenti logici: un estrattore generico di array, un gestore dati dipendente con attributi opzionali, un analizzatore di risposte API con unioni discriminate, un sistema di gestione task con classi/utility types e un gestore di permessi dashboard tramite guardie di tipo personalizzate.

1 · Primo elemento generico

Scrivi una funzione generica che accetta un array di elementi di tipo T e restituisce il primo elemento (o undefined se l’array è vuoto). Modulo 3 (Generics).

Esercizio#ts.boss.e1
Tentativi: 0Caricamento…

Definisci la funzione generica firstElement<T>(arr: T[]): T | undefined che restituisce il primo elemento dell’array.

Caricamento editor…
Mostra suggerimento

Usa la firma generica <T> prima dei parametri. La funzione ritornerà arr[0] o undefined.

Soluzione disponibile dopo 3 tentativi

2 · Gestore dati dipendente opzionale

Definisci un’interfaccia Employee con un campo salary opzionale, e una funzione getSalary che restituisce il salario o 0 se non specificato. Modulo 2 (Interfacce e opzionalità).

Esercizio#ts.boss.e2
Tentativi: 0Caricamento…

Crea l’interfaccia Employee con id (number), name (string) e salary (number opzionale). Scrivi poi getSalary(emp: Employee): number che controlla se salary esiste prima di ritornarlo.

Caricamento editor…
Mostra suggerimento

Usa il punto di domanda salary?: number nell’interfaccia e l’operatore di coalescenza nullish (??) nella funzione.

Soluzione disponibile dopo 3 tentativi

3 · Unione discriminata per risposta API

Definisci un tipo per gestire una risposta API che può essere un successo (con dati generici) o un errore (con messaggio stringa). Modulo 2 (Unioni e Restringimento) + Modulo 3 (Generics).

Esercizio#ts.boss.e3
Tentativi: 0Caricamento…

Crea ApiResponse<T> come unione tra Success<T> (status: "success", data: T) e Failure (status: "error", message: string). Scrivi handleResponse<T>(res: ApiResponse<T>): string che controlla res.status e restituisce "Data: " + res.data o "Error: " + res.message.

Caricamento editor…
Mostra suggerimento

Controlla res.status === "success" per fare restringimento del tipo (type narrowing) a runtime.

Soluzione disponibile dopo 3 tentativi

4 · Classe Manager di Task

Definisci un type alias NewTask che omette id e completed da un’interfaccia Task esistente, ed implementa una classe TaskManager che gestisce un array privato di Task. Modulo 4 (Classi e Utility Types).

Esercizio#ts.boss.e4
Tentativi: 0Caricamento…

Definisci il tipo NewTask omettendo id e completed da Task. Crea la classe TaskManager che implementa ITaskManager, gestendo un array privato tasks e un contatore nextId per generare ID incrementali a partire da 1 nel metodo addTask.

Caricamento editor…
Mostra suggerimento

Usa type NewTask = Omit<Task, "id" | "completed">; per escludere le chiavi. Nella classe, definisci private tasks: Task[] = []; e private nextId: number = 1;.

Soluzione disponibile dopo 3 tentativi

5 · Guardie di tipo e permessi

Definisci un tipo utente NormalUser o Admin con unioni discriminate. Scrivi una guardia di tipo personalizzata isAdmin e una funzione getDashboardAccess per restituire una stringa di accesso specifica a seconda del ruolo dell’utente. Modulo 5 (Tipi Avanzati e Guardie).

Esercizio#ts.boss.e5
Tentativi: 0Caricamento…

Definisci il tipo guard isAdmin(user: User): user is Admin che controlla se user.role === "admin". Scrivi poi la funzione getDashboardAccess(user: User): string che usa la guardia isAdmin per restituire "Admin Access: " + user.permissions.join(", ") per gli admin, oppure "Standard Access for " + user.username per gli utenti normali.

Caricamento editor…
Mostra suggerimento

Usa function isAdmin(user: User): user is Admin { return user.role === "admin"; }. Nella funzione getDashboardAccess, usa un blocco if per testare isAdmin(user) prima di accedere alla proprietà permissions.

Soluzione disponibile dopo 3 tentativi

Cheatsheet stampabile

Una pagina con tutta la sintassi essenziale di TypeScript moderno, pronta da tenere sotto mano mentre sviluppi.

Apri il cheatsheet

E adesso?

La pratica costante è il modo migliore per rafforzare le proprie competenze. Apri il Playground TypeScript per sperimentare liberamente con scenari complessi o per preparare i tuoi frammenti prima di provarli nei tuoi progetti reali.