TypeScript - Tipi Condizionali
Ciao, futuri maghi di TypeScript! Oggi ci imbarcheremo in un viaggio entusiasmante nel mondo dei Tipi Condizionali. Non preoccupatevi se siete nuovi alla programmazione - sarò il vostro guida amichevole, e prenderemo tutto passo per passo. Alla fine di questa lezione, rimarrete sorpresi da quanto avete imparato!
Tipi Condizionali di Base
Iniziamo con le basi. I Tipi Condizionali in TypeScript sono come fare decisioni nel vostro codice. Immaginate di essere in una gelateria e dover scegliere tra cioccolato e vaniglia a seconda se è un giorno caldo o no. Questo è essenzialmente ciò che i Tipi Condizionali fanno in TypeScript!
Ecco un esempio semplice:
type IceCreamChoice = boolean extends true ? "Chocolate" : "Vanilla";
In questo codice, stiamo dicendo: "Se boolean (che rappresenta vero o falso) può essere vero, allora scegli Chocolate; altrimenti, scegli Vanilla."
Ma aspetta, boolean può sempre essere vero, vero? Allora, rendiamo questo più pratico:
type WeatherChoice<T> = T extends "Hot" ? "Ice Cream" : "Hot Chocolate";
let summerChoice: WeatherChoice<"Hot"> = "Ice Cream";
let winterChoice: WeatherChoice<"Cold"> = "Hot Chocolate";
Qui, abbiamo creato un tipo WeatherChoice
che accetta un parametro di tipo T
. Se T
estende (o corrisponde) a "Hot", scegliamo "Ice Cream"; altrimenti, scegliamo "Hot Chocolate".
Tipi Condizionali Generici
Ora, diamo un upgrade! I Tipi Condizionali Generici ci permettono di rendere i nostri tipi più flessibili e riutilizzabili. Pensateci come creare una gelateria super-flessibile che può fare gusti diversi in base a ciò che mettete dentro.
type IsArray<T> = T extends any[] ? true : false;
type CheckString = IsArray<string>; // false
type CheckNumberArray = IsArray<number[]>; // true
In questo esempio, IsArray
è un tipo generico che verifica se l'input T
è un array. Se lo è, restituisce true
; altrimenti, restituisce false
.
Proviamo qualcosa di più complesso:
type ElementType<T> = T extends (infer U)[] ? U : never;
type StringArrayElement = ElementType<string[]>; // string
type NumberArrayElement = ElementType<number[]>; // number
type NotArrayElement = ElementType<number>; // never
Qui, ElementType
estrae il tipo degli elementi in un array. Se T
è un array, inferisce il tipo dell'elemento U
e lo restituisce. Se T
non è un array, restituisce never
(che significa "questo non dovrebbe mai accadere").
vincoli sui tipi condizionali
A volte, vogliamo mettere alcune restrizioni sui nostri tipi. È come dire, "Puoi avere il gelato solo se hai finito le verdure!" Vediamo come funziona questo in TypeScript:
type NumberOperation<T extends number> = T extends 0 ? "Zero" : "Non-zero";
type ZeroCheck = NumberOperation<0>; // "Zero"
type NonZeroCheck = NumberOperation<5>; // "Non-zero"
type InvalidCheck = NumberOperation<"5">; // Errore: Type '"5"' does not satisfy the constraint 'number'.
In questo esempio, NumberOperation
accetta solo tipi che estendono number
. Poi verifica se il numero è 0 o no.
Inferenza all'interno dei tipi condizionali
Ultimo ma non meno importante, parliamo di inferenza all'interno dei tipi condizionali. Questo è come avere una gelateria super-intelligente che può capire quale gusto vuoi in base al tuo umore!
type Flatten<T> = T extends Array<infer U> ? U : T;
type FlattenedNumberArray = Flatten<number[]>; // number
type FlattenedString = Flatten<string>; // string
Qui, Flatten
verifica se T
è un array. Se lo è, inferisce il tipo dell'elemento U
e lo restituisce. Se non lo è, restituisce T
così com'è.
Proviamo qualcosa di più avanzato:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
function greet(name: string): string {
return `Hello, ${name}!`;
}
type GreetReturn = ReturnType<typeof greet>; // string
In questo esempio, ReturnType
inferisce il tipo di ritorno di una funzione. Verifica se T
è un tipo di funzione, e se lo è, inferisce e restituisce il tipo di ritorno R
.
Conclusione
Congratulazioni! Avete appena fatto i vostri primi passi nel mondo dei Tipi Condizionali in TypeScript. Ricordate, come imparare a guidare una bicicletta, potrebbe sembrare instabile all'inizio, ma con la pratica, diventerete rapidi in pochissimo tempo!
Ecco una tabella di riepilogo dei metodi che abbiamo coperto:
Metodo | Descrizione |
---|---|
Tipi Condizionali di Base | Fare decisioni di tipo basate su condizioni |
Tipi Condizionali Generici | Creare tipi condizionali flessibili e riutilizzabili |
Vincoli sui Tipi Condizionali | Mettere restrizioni sugli input dei tipi |
Inferenza all'interno dei Tipi Condizionali | Estrarre e inferire tipi all'interno delle condizioni |
Continuate a praticare, rimanete curiosi, e prima di sapere, creareте cose meravigliose con TypeScript. Buon codice, futuri maestri di TypeScript!
Credits: Image by storyset