Tipos genéricos en TypeScript

De ChuWiki


Los tipos genéricos en TypeScript son una característica poderosa que permite escribir código flexible y reutilizable al trabajar con diferentes tipos de datos de manera abstracta. Aquí te explico en detalle qué son y cómo se utilizan los tipos genéricos:

¿Qué son los tipos genéricos?[editar]

Los tipos genéricos permiten definir funciones, clases o interfaces que pueden trabajar con varios tipos de datos de manera flexible y segura. En esencia, te permiten crear componentes que sean independientes del tipo específico sobre el cual están operando.

Sintaxis básica[editar]

Los tipos genéricos se definen usando paréntesis angulares `< >` con un nombre de tipo genérico dentro. Por convención, se usa una sola letra (por ejemplo, `T`, `U`, `V`) para representar tipos genéricos, pero puedes usar cualquier nombre válido de identificador.

Ejemplo de función genérica[editar]

function identity<T>(arg: T): T {
  return arg;
}

let result = identity<string>("Hello");
console.log(result); // Output: Hello

let result2 = identity<number>(42);
console.log(result2); // Output: 42

En este ejemplo: - `<T>` indica que `identity` es una función genérica que toma un tipo `T`. - `arg: T` significa que el parámetro `arg` puede ser de cualquier tipo `T`. - El tipo de retorno `T` asegura que la función devuelve el mismo tipo que recibe como argumento.

Uso de tipos genéricos en funciones[editar]

Los tipos genéricos pueden ser utilizados en varios lugares dentro de una función:

Parámetros múltiples genéricos[editar]

function pair<T, U>(first: T, second: U): [T, U] {
  return [first, second];
}

let p1 = pair(5, "five"); // Infiere tipos: [number, string]
console.log(p1); // Output: [5, "five"]

let p2 = pair(true, 42); // Infiere tipos: [boolean, number]
console.log(p2); // Output: [true, 42]

Restricciones de tipo[editar]

Puedes restringir los tipos que puede tomar un tipo genérico usando `extends`:

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length); // Sabemos que arg tiene la propiedad .length
  return arg;
}

loggingIdentity({ length: 10, value: 3 }); // Funciona

Uso de tipos genéricos en clases[editar]

Los tipos genéricos también pueden ser utilizados en la declaración de clases para hacer que la clase sea genérica sobre uno o más tipos.

class Box<T> {
  private contents: T;

  constructor(value: T) {
    this.contents = value;
  }

  getValue(): T {
    return this.contents;
  }
}

let box1 = new Box<string>("Hello");
console.log(box1.getValue()); // Output: Hello

let box2 = new Box<number>(42);
console.log(box2.getValue()); // Output: 42

Conclusiones sobre tipos genéricos[editar]

  • Reusabilidad: Los tipos genéricos permiten escribir código que puede manejar múltiples tipos de datos sin repetir lógica.
  • Flexibilidad: Proporcionan flexibilidad al permitir que las funciones y las clases se adapten automáticamente a diferentes tipos de datos.
  • Seguridad de tipos: Aunque son flexibles, TypeScript aún proporciona chequeos de tipo estáticos para garantizar la seguridad de tipos en tiempo de compilación.

Los tipos genéricos son esenciales para escribir bibliotecas y funciones que puedan ser utilizadas con una amplia gama de tipos de datos, lo que hace que TypeScript sea más robusto y escalable para proyectos grandes y complejos.