Els tipus condicionals en TypeScript són una característica avançada que permet definir tipus basats en una condició. Són similars a les expressions condicionals (ternàries) en JavaScript, però aplicades als tipus. Aquesta funcionalitat és molt poderosa i permet crear tipus més flexibles i reutilitzables.

Conceptes Clau

  1. Sintaxi Bàsica:

    T extends U ? X : Y
    
    • T extends U: Aquesta és la condició. Si T és assignable a U, el tipus resultant serà X.
    • X: El tipus resultant si la condició és certa.
    • Y: El tipus resultant si la condició és falsa.
  2. Assignabilitat:

    • La condició T extends U comprova si T és assignable a U. Això significa que T ha de tenir totes les propietats de U.

Exemples Pràctics

Exemple 1: Tipus Bàsic Condicional

type IsString<T> = T extends string ? "Yes" : "No";

type A = IsString<string>;  // "Yes"
type B = IsString<number>;  // "No"

Exemple 2: Filtratge de Tipus

type Filter<T, U> = T extends U ? T : never;

type Numbers = Filter<number | string | boolean, number>;  // number
type Strings = Filter<number | string | boolean, string>;  // string

Exemple 3: Tipus de Retorn Condicional

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

type Func = () => string;
type FuncReturnType = ReturnType<Func>;  // string

Exemple 4: Excloure Tipus

type Exclude<T, U> = T extends U ? never : T;

type NonString = Exclude<string | number | boolean, string>;  // number | boolean

Exercicis Pràctics

Exercici 1: Crear un Tipus Condicional

Defineix un tipus condicional IsBoolean<T> que retorni "True" si T és un boolean i "False" en cas contrari.

type IsBoolean<T> = T extends boolean ? "True" : "False";

// Proves
type Test1 = IsBoolean<boolean>;  // "True"
type Test2 = IsBoolean<string>;   // "False"

Exercici 2: Filtrar Tipus

Defineix un tipus ExtractString<T> que extregui només els tipus string de T.

type ExtractString<T> = T extends string ? T : never;

// Proves
type Test3 = ExtractString<string | number | boolean>;  // string
type Test4 = ExtractString<number | boolean>;           // never

Exercici 3: Tipus de Retorn

Defineix un tipus FunctionReturnType<T> que extregui el tipus de retorn d'una funció T.

type FunctionReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

// Proves
type Test5 = FunctionReturnType<() => number>;  // number
type Test6 = FunctionReturnType<(x: string) => void>;  // void

Errors Comuns i Consells

  1. Confusió amb extends:

    • Recorda que extends en aquest context no significa herència, sinó assignabilitat. És una verificació de si un tipus és assignable a un altre.
  2. Tipus Complexos:

    • Quan treballis amb tipus condicionals complexos, pot ser útil desglossar-los en tipus més petits i manejables per facilitar la comprensió i el manteniment.
  3. Inferència de Tipus:

    • Utilitza infer per extreure tipus dins de tipus condicionals. Això pot simplificar molt les definicions de tipus.

Conclusió

Els tipus condicionals són una eina poderosa en TypeScript que permet crear tipus dinàmics i flexibles basats en condicions. Amb la pràctica, podràs utilitzar-los per escriure codi més robust i reutilitzable. En el proper mòdul, explorarem com treballar amb funcions i mòduls en TypeScript, aprofundint en la definició de tipus de funció i l'ús de mòduls per organitzar el codi.

© Copyright 2024. Tots els drets reservats