TypeScript - Annotazioni dei tipi: Una guida per i principianti

Ciao ciao, futuro super campione del coding! ? Bentornato in questa avventura emozionante nel mondo di TypeScript e delle annotazioni dei tipi. Come il tuo insegnante di scienze informatiche del vicinato, sono entusiasta di guidarti in questa avventura. Non preoccuparti se sei nuovo alla programmazione - inizieremo dal principio e scaleremo insieme. Allora, prendi il tuo zaino virtuale e tuffati!

TypeScript - Type Annotations

Cos'è un'Annotazione di Tipo?

Immagina di preparare la valigia per un viaggio. Hai borse diverse per diversi oggetti - una per i vestiti, una per i prodotti da bagno e una per l'elettronica. Le annotazioni di tipo in TypeScript sono come le etichette su queste borse. Ci dicono a noi e al computer che tipo di "roba" (dati) stiamo trattando.

Nel mondo di TypeScript, le annotazioni di tipo sono un modo per indicare esplicitamente al compilatore quale tipo di valore può contenere una variabile, un parametro di funzione o una proprietà di oggetto. È come dare al computer un avviso su cosa aspettarsi.

Perché Usare le Annotazioni di Tipo?

  1. Rilevare errori presto: Aiutano a individuare errori prima di eseguire il codice.
  2. Meglio la documentazione del codice: Rendono il codice più facile da comprendere.
  3. Esperienza di sviluppo migliorata: Forniscono una migliore autocomplete e IntelliSense negli editor di codice.

Ora, esaminiamo diversi modi in cui possiamo usare le annotazioni di tipo.

Annotazioni di Tipo per Variabili

Quando creiamo una variabile in TypeScript, possiamo aggiungere un'annotazione di tipo per specificare che tipo di valore dovrebbe contenere.

Sintassi di Base

let nomeVariabile: Tipo = valore;

Ecco alcuni esempi:

let mioNome: string = "Alice";
let miaEta: number = 30;
let sonoStudente: boolean = true;

In questi esempi, stiamo dicendo a TypeScript:

  • mioNome dovrebbe contenere solo testo (stringhe)
  • miaEta dovrebbe essere solo un numero
  • sonoStudente dovrebbe essere solo vero o falso (booleano)

Se proviamo ad assegnare un tipo di valore diverso successivamente, TypeScript ci avviserà:

mioNome = 42; //Errore: Type 'number' is not assignable to type 'string'

Array e Tipi Speciali

Possiamo anche annotare array e usare tipi speciali:

let preferiti: string[] = ["pizza", "coding", "gatti"];
let anything: any = "Posso essere tutto!";
let maybe: unknown = 4;
  • string[] significa un array di stringhe
  • any è un tipo speciale che può essere anything (usalo con moderazione!)
  • unknown è un'alternativa più sicura a any

Annotazioni di Tipo per Funzioni

Le funzioni possono avere annotazioni di tipo per i parametri e i valori di ritorno.

Sintassi di Base

function nomeFunzione(param1: Tipo1, param2: Tipo2): TipoRitorno {
// corpo della funzione
}

Ecco alcuni esempi:

function saluta(nome: string): string {
return `Ciao, ${nome}!`;
}

function somma(a: number, b: number): number {
return a + b;
}

function logMessage(messaggio: string): void {
console.log(messaggio);
}

In questi esempi:

  • saluta accetta una stringa e restituisce una stringa
  • somma accetta due numeri e restituisce un numero
  • logMessage accetta una stringa ma non restituisce nulla (void)

Funzioni Freccia

Le funzioni freccia possono anche avere annotazioni di tipo:

const moltiplica = (a: number, b: number): number => a * b;

Annotazioni di Tipo per Proprietà di Oggetti

Quando lavoriamo con oggetti, possiamo annotare le loro proprietà.

Sintassi di Base

let nomeOggetto: { proprietà1: Tipo1; proprietà2: Tipo2 } = {
proprietà1: valore1,
proprietà2: valore2
};

Ecco un esempio:

let utente: { nome: string; età: number; isAdmin: boolean } = {
nome: "Bob",
età: 25,
isAdmin: false
};

Qui, stiamo definendo un oggetto con tipi di proprietà specifici.

Interfacce per Oggetti Complessi

Per oggetti più complessi, possiamo usare le interfacce:

interface Persona {
nome: string;
età: number;
hobby: string[];
greet: () => void;
}

let dipendente: Persona = {
nome: "Charlie",
età: 30,
hobby: ["leggere", "gaming"],
greet: () => console.log("Ciao!")
};

Le interfacce ci aiutano a definire forme di oggetto riutilizzabili.

Mettendo Tutto Insieme

Ora che abbiamo imparato diverse annotazioni di tipo, vediamole in azione con un esempio più complesso:

interface Libro {
titolo: string;
autore: string;
pagine: number;
èPubblicato: boolean;
}

function creaElencoLibri(libri: Libro[]): string[] {
return libri.map(libro => `${libro.titolo} by ${libro.autore}`);
}

const mieiLibri: Libro[] = [
{ titolo: "TypeScript 101", autore: "Code Wizard", pagine: 200, èPubblicato: true },
{ titolo: "JavaScript Adventures", autore: "JS Ninja", pagine: 150, èPubblicato: false }
];

const titoliLibri: string[] = creaElencoLibri(mieiLibri);
console.log(titoliLibri);

Questo esempio combina vari concetti che abbiamo imparato:

  • Definiamo un'interfaccia Libro
  • Creiamo una funzione creaElencoLibri che accetta un array di Libro oggetti e restituisce un array di stringhe
  • Creiamo un array di Libro oggetti
  • Chiamiamo la funzione e memorizziamo il risultato in una variabile con l'annotazione di tipo corretta

Conclusione

Congratulazioni! Hai appena fatto i tuoi primi passi nel mondo delle annotazioni di tipo di TypeScript. Ricorda, queste annotazioni sono come cartelli amichevoli che guidano te e il tuo codice verso la sicurezza. Potrebbero sembrare un po' opprimenti all'inizio, ma con la pratica diventeranno secondi natura.

Mentre continui il tuo viaggio di programmazione, continua a sperimentare con diversi tipi e annotazioni. Non aver paura di fare errori - è così che impariamo e cresciamo!

Ecco una tabella comoda che riassume le annotazioni di tipo che abbiamo coperto:

Annotazione di Tipo Esempio Descrizione
Tipi di Base let nome: string = "Alice"; Per valori semplici come stringhe, numeri, booleani
Tipi di Array let numeri: number[] = [1, 2, 3]; Per array di un tipo specifico
Tipi di Funzione function somma(a: number, b: number): number Per parametri e valori di ritorno delle funzioni
Tipi di Oggetto let utente: { nome: string; età: number; }; Per proprietà di oggetto
Interfacce interface Persona { nome: string; età: number; } Per definire forme di oggetto complesse

Continua a programmare, rimani curioso, e ricorda - ogni maestro era una volta un principiante. Buon TypeScripting! ??‍??‍?

Credits: Image by storyset