Los genéricos en TypeScript son una poderosa característica que permite crear componentes reutilizables y flexibles. Los genéricos proporcionan una forma de definir funciones, clases e interfaces que pueden trabajar con diferentes tipos sin perder la tipificación estática.
Conceptos Clave
- Definición de Genéricos: Los genéricos permiten que una función, clase o interfaz trabaje con cualquier tipo de dato.
- Parámetros Genéricos: Se utilizan para definir el tipo de dato que se va a usar.
- Restricciones de Genéricos: Permiten limitar los tipos que se pueden usar con un genérico.
Ejemplos Prácticos
Funciones Genéricas
Las funciones genéricas permiten que una función trabaje con diferentes tipos de datos sin perder la tipificación.
function identity<T>(arg: T): T { return arg; } // Uso de la función genérica let output1 = identity<string>("Hola Mundo"); let output2 = identity<number>(100);
Explicación:
T
es un parámetro genérico que actúa como un marcador de posición para el tipo que se pasará a la función.identity<string>("Hola Mundo")
especifica queT
es de tipostring
.identity<number>(100)
especifica queT
es de tiponumber
.
Clases Genéricas
Las clases genéricas permiten que una clase trabaje con diferentes tipos de datos.
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; };
Explicación:
GenericNumber<T>
es una clase genérica con un parámetro de tipoT
.zeroValue
yadd
utilizan el tipoT
.myGenericNumber
es una instancia deGenericNumber
dondeT
esnumber
.
Interfaces Genéricas
Las interfaces genéricas permiten definir contratos que pueden trabajar con diferentes tipos de datos.
interface Pair<T, U> { first: T; second: U; } let pair: Pair<string, number> = { first: "uno", second: 1 };
Explicación:
Pair<T, U>
es una interfaz genérica con dos parámetros de tipoT
yU
.pair
es una instancia dePair
dondeT
esstring
yU
esnumber
.
Restricciones de Genéricos
Las restricciones permiten limitar los tipos que se pueden usar con un genérico.
interface Lengthwise { length: number; } function loggingIdentity<T extends Lengthwise>(arg: T): T { console.log(arg.length); return arg; } // Uso de la función con restricción loggingIdentity({ length: 10, value: 3 });
Explicación:
T extends Lengthwise
indica queT
debe tener una propiedadlength
.loggingIdentity
puede aceptar cualquier tipo que tenga una propiedadlength
.
Ejercicios Prácticos
Ejercicio 1: Función Genérica
Crea una función genérica reverseArray
que tome un array de cualquier tipo y devuelva un nuevo array con los elementos en orden inverso.
function reverseArray<T>(items: T[]): T[] { return items.reverse(); } // Prueba la función let reversedNumbers = reverseArray<number>([1, 2, 3, 4]); console.log(reversedNumbers); // [4, 3, 2, 1] let reversedStrings = reverseArray<string>(["a", "b", "c"]); console.log(reversedStrings); // ["c", "b", "a"]
Ejercicio 2: Clase Genérica
Crea una clase genérica Stack
que implemente una pila (stack) con operaciones push
, pop
y peek
.
class Stack<T> { private items: T[] = []; push(item: T): void { this.items.push(item); } pop(): T | undefined { return this.items.pop(); } peek(): T | undefined { return this.items[this.items.length - 1]; } } // Prueba la clase let numberStack = new Stack<number>(); numberStack.push(10); numberStack.push(20); console.log(numberStack.peek()); // 20 console.log(numberStack.pop()); // 20 console.log(numberStack.pop()); // 10
Resumen
En esta sección, hemos aprendido sobre los genéricos en TypeScript, una característica que permite crear componentes reutilizables y flexibles. Hemos cubierto:
- La definición y uso de funciones, clases e interfaces genéricas.
- Cómo aplicar restricciones a los genéricos para limitar los tipos permitidos.
- Ejemplos prácticos y ejercicios para reforzar los conceptos.
En el siguiente tema, exploraremos los alias de tipos, una herramienta útil para simplificar y mejorar la legibilidad del código.
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