Lezioni del modulo (1/2)
Tipi Condizionali e infer
I tipi condizionali permettono di esprimere decisioni di tipo non banali basandosi su relazioni di ereditarietà. La sintassi assomiglia a quella dell'operatore ternario di JavaScript:
T extends U ? X : YSe il tipo T è assegnabile a U, allora il tipo risultante sarà X, altrimenti sarà Y.
Tipi Condizionali Base
Un tipo condizionale valuta una condizione a livello di tipo statically:
type IsNumber<T> = T extends number ? true : false;
type A = IsNumber<number>; // true
type B = IsNumber<string>; // falseQuesto pattern è estremamente potente quando combinato con i generics per creare utility types flessibili e dinamici.
Estrazione di Tipi con infer
All'interno della clausola extends di un tipo condizionale, possiamo usare la parola chiave infer per dichiarare una variabile di tipo che deve essere dedotta dal compilatore.
Ad esempio, se vogliamo estrarre il tipo restituito da una funzione:
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type FunzioneEsempio = () => string;
type Ritorno = GetReturnType<FunzioneEsempio>; // stringIn questo esempio, infer R indica a TypeScript di ricavare automaticamente il tipo di ritorno della funzione e di renderlo disponibile come R nel ramo positivo del condizionale.
Prova tu
Esercizio 1: Il tipo IsString
Crea un tipo generico chiamato IsString<T> che restituisce il tipo letterale true se T estende string, altrimenti false.
Mostra suggerimento
Usa la sintassi type IsString<T> = T extends string ? true : false; per controllare il tipo.
Soluzione disponibile dopo 3 tentativi
Esercizio 2: Estrarre il tipo da un Array con infer
Definisci un tipo generico UnpackArray<T> che usa infer per estrarre il tipo degli elementi di un array T. Se T è un array (ad esempio U[]), restituisce U, altrimenti restituisce lo stesso tipo T.
Mostra suggerimento
Usa T extends (infer U)[] ? U : T per dichiarare e restituire la variabile di tipo dedotta U.
Soluzione disponibile dopo 3 tentativi