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!

TypeScript - Conditional Types

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