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:
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.
Curso de TypeScript
Módulo 1: Introducción a TypeScript
- ¿Qué es TypeScript?
- Configuración del Entorno de TypeScript
- Tipos Básicos
- Anotaciones de Tipo
- Compilando TypeScript
Módulo 2: Trabajando con Tipos
Módulo 3: Tipos Avanzados
Módulo 4: Funciones y Módulos
- Tipos de Función
- Parámetros Opcionales y Predeterminados
- Parámetros Rest
- Módulos y Espacios de Nombres
- Decoradores
Módulo 5: Programación Asíncrona
Módulo 6: Herramientas y Mejores Prácticas
- Linting y Formateo
- Pruebas de Código TypeScript
- TypeScript con Webpack
- TypeScript con React
- Mejores Prácticas
