Los tipos condicionales en TypeScript son una característica avanzada que permite definir tipos basados en una condición. Esto es similar a las declaraciones if en el código, pero se aplica a los tipos. Los tipos condicionales son útiles para crear tipos más flexibles y reutilizables.

Sintaxis Básica

La sintaxis básica de un tipo condicional es la siguiente:

T extends U ? X : Y

Aquí, T es el tipo que estamos evaluando, U es el tipo contra el que estamos comparando, X es el tipo que se devuelve si T extiende U, y Y es el tipo que se devuelve si T no extiende U.

Ejemplo Básico

Veamos un ejemplo simple para entender cómo funcionan los tipos condicionales:

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

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

En este ejemplo, IsString es un tipo condicional que verifica si T es un string. Si T es un string, el tipo resultante es "Yes", de lo contrario, es "No".

Uso de Tipos Condicionales

Filtrado de Tipos

Los tipos condicionales pueden ser utilizados para filtrar tipos dentro de una unión:

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

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

En este ejemplo, Filter toma dos tipos T y U. Si T extiende U, el tipo resultante es T, de lo contrario, es never. Esto se puede usar para filtrar tipos específicos de una unión.

Inferencia de Tipos

Los tipos condicionales también pueden inferir tipos usando la palabra clave infer:

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

type Func = () => string;
type ReturnTypeOfFunc = GetReturnType<Func>;  // string

En este ejemplo, GetReturnType toma un tipo T y verifica si es una función. Si es una función, infiere el tipo de retorno R y lo devuelve. Si no es una función, devuelve never.

Ejercicios Prácticos

Ejercicio 1: Filtrar Tipos

Crea un tipo condicional llamado ExtractString que filtre los tipos string de una unión de tipos.

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

type Test1 = ExtractString<string | number | boolean>;  // string
type Test2 = ExtractString<number | boolean>;  // never

Ejercicio 2: Inferir Tipos de Parámetros

Crea un tipo condicional llamado GetFirstParameterType que infiera el tipo del primer parámetro de una función.

type GetFirstParameterType<T> = T extends (arg1: infer P, ...args: any[]) => any ? P : never;

type Func1 = (x: number, y: string) => void;
type ParamType1 = GetFirstParameterType<Func1>;  // number

type Func2 = (x: boolean) => void;
type ParamType2 = GetFirstParameterType<Func2>;  // boolean

Resumen

Los tipos condicionales en TypeScript son una herramienta poderosa para crear tipos dinámicos y flexibles. Permiten definir tipos basados en condiciones, filtrar tipos dentro de una unión e inferir tipos de parámetros y retornos de funciones. Con la práctica, los tipos condicionales pueden mejorar significativamente la capacidad de tipado y la flexibilidad de tu código TypeScript.

En el siguiente módulo, exploraremos más sobre funciones y módulos, donde aprenderemos a definir tipos de función, trabajar con parámetros opcionales y predeterminados, y mucho más.

© Copyright 2024. Todos los derechos reservados