01 · Fondamenti
- annotazioni
- tipi primitivi
- esplicito vs implicito
- array string[] / number[]
- tuple fisse
Fine del Corso TypeScript
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.
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.
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).
Definisci la funzione generica firstElement<T>(arr: T[]): T | undefined che restituisce il primo elemento dell’array.
Usa la firma generica <T> prima dei parametri. La funzione ritornerà arr[0] o undefined.
Soluzione disponibile dopo 3 tentativi
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à).
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.
Usa il punto di domanda salary?: number nell’interfaccia e l’operatore di coalescenza nullish (??) nella funzione.
Soluzione disponibile dopo 3 tentativi
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).
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.
Controlla res.status === "success" per fare restringimento del tipo (type narrowing) a runtime.
Soluzione disponibile dopo 3 tentativi
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).
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.
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
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).
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.
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
Una pagina con tutta la sintassi essenziale di TypeScript moderno, pronta da tenere sotto mano mentre sviluppi.
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.