Saltar al contenido principal

Genéricos y Plantillas

Los genéricos te permiten escribir código reutilizable y con tipos seguros. Así es como los diferentes lenguajes manejan la programación genérica.

Genéricos Básicos​

// JavaScript has no built-in generics
// Use TypeScript for generic support

// TypeScript generics:
// function identity<T>(value: T): T {
// return value;
// }
// identity<string>("hello");
// identity<number>(42);

// Generic interface (TypeScript)
// interface Container<T> {
// value: T;
// getValue(): T;
// }

// Generic class (TypeScript)
// class Box<T> {
// constructor(private value: T) {}
// get(): T { return this.value; }
// }
// const box = new Box<string>("hello");

Restricciones de Tipo​

// TypeScript constraints
// function max<T extends number>(a: T, b: T): T {
// return a > b ? a : b;
// }

// Interface constraint
// interface HasLength { length: number; }
// function logLength<T extends HasLength>(item: T): void {
// console.log(item.length);
// }
// logLength("hello"); // OK
// logLength([1, 2, 3]); // OK
// logLength(42); // Error

// keyof constraint
// function getProperty<T, K extends keyof T>(
// obj: T, key: K
// ): T[K] {
// return obj[key];
// }

Puntos Clave​

  • Borrado de tipos vs monomorfización -- Java y TypeScript borran los genéricos en tiempo de ejecución (una representación compartida); C++, Rust, Swift y Go generan código especializado por tipo (monomorfización) para abstracción de costo cero.
  • Los sistemas de restricciones varían en expresividad -- Los traits de Rust y los concepts de C++ ofrecen límites ricos; los conjuntos de tipos de Go (~int | ~float64) y las restricciones de protocolo de Swift son más simples; el extends de Java y los comodines son más limitados.
  • Los lenguajes sin genéricos usan alternativas -- C usa void* y macros; JavaScript/Ruby dependen del duck typing; PHP usa anotaciones docblock para análisis estático; Zig usa parámetros de tipo en tiempo de compilación.
  • Los genéricos comptime (Zig) son únicos -- Zig pasa tipos como valores en tiempo de compilación, habilitando genéricos de costo cero sin una sintaxis separada de parámetros de tipo; los tipos son de primera clase en tiempo de compilación.
  • Python y PHP tienen genéricos tardíos -- Python 3.12+ y PHPStan/Psalm añaden sintaxis genérica; la verificación de tipos es solo estática—el comportamiento en tiempo de ejecución no cambia—a diferencia de los lenguajes compilados.