window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versión: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster ya existe') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Genéricos en TypeScript - The Codest
The Codest
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Industrias
    • Fintech y Banca
    • E-commerce
    • Adtech
    • Tecnología sanitaria
    • Fabricación
    • Logística
    • Automoción
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
Flecha atrás VOLVER
2020-05-26
Desarrollo de software

Genéricos en TypeScript

Mateusz Staniuk

Los genéricos proporcionan fragmentos de código reutilizables que funcionan con varios tipos en lugar de con un único tipo. Los genéricos permiten tratar el tipo como una variable y especificarlo al utilizarlo, de forma similar a los parámetros de función.

Los genéricos pueden utilizarse junto con funciones (creación de función genérica), clases (creación de clase genérica) e interfaces (creación de interfaz genérica).

Uso básico

Probablemente hayas utilizado genéricos en el pasado incluso sin saberlo - el uso más común de genéricos es declarar un array:

const miMatriz: cadena[];

No es demasiado especial a primera vista, sólo declaramos miMatriz como una matriz de cadenas, pero es lo mismo que una declaración genérica:

const myArray: Array;

Mantener las cosas explícitas

Empecemos con un ejemplo muy sencillo: cómo podríamos portar esta función vanilla JS a TypeScript:

function getPrefiledArray(relleno, longitud) {
    return (new Array(length)).fill(filler);
}

Esta función devolverá un array lleno con la cantidad dada de rellenoAsí que longitud será número y la función completa devolverá un array de relleno - pero, ¿qué es el relleno? En este punto puede ser cualquier cosa, así que una opción es utilizar cualquier:

function getPrefiledArray(filler: any, length: number): any[] {
    return (new Array(length)).fill(filler);
}

Utilizando cualquier es ciertamente genérico - podemos pasar literalmente cualquier cosa, por lo que "trabajar con un número de tipos en lugar de un único tipo" de la definición está totalmente cubierto, pero perdemos la conexión entre relleno y el tipo de retorno. En este caso, queremos devolver alguna cosa común, y podemos definir explícitamente esta cosa común como parámetro de tipo:

function getPrefiledArray(relleno: T, longitud: número): T[] {
    return (new Array(length)).fill(filler);
}

y usarlo así:

const prefilledArray = getPrefiledArray(0, 10);

Restricciones genéricas

Veamos otros casos, probablemente más comunes. ¿Por qué usamos tipos en las funciones? Para mí, es para asegurar que los argumentos pasados a la función tendrán algunas propiedades con las que quiero interactuar.

Una vez más vamos a intentar portar una simple función vanilla JS a TS.

function getLength(cosa) {
    return cosa.longitud;
}

Tenemos un enigma no trivial: ¿cómo garantizar que la cosa tiene un longitud propiedad, y el primer pensamiento puede ser hacer algo como:

function getLength(cosa: typeof Array):number {
    return cosa.longitud;
}

y dependiendo del contexto puede ser correcto, en general somos un poco genéricos - funcionará con arrays de múltiples tipos, pero ¿qué pasa si no sabemos realmente si la cosa debe ser siempre un array - tal vez la cosa es un campo de fútbol o una cáscara de plátano? En este caso, tenemos que recoger las propiedades comunes de esa cosa en una construcción que puede definir las propiedades de un objeto - una interfaz:

interfaz IThingWithLength {
  longitud: número;
}

Podemos utilizar IThingWithLength como tipo de la interfaz cosa parámetro:

function getLength(cosa: ITCosaConLongitud):number {
    return cosa.longitud;
}

francamente en este sencillo ejemplo, estará perfectamente bien, pero si queremos mantener este tipo genérico, y no enfrentarnos al problema del primer ejemplo podemos usar Restricciones genéricas:

function getLength(cosa: T):number {
    return cosa.longitud;
}

y úsalo:

interfaz IBananaPeel {
  grosor: número;
  longitud: número;
}

const bananaPeel: IBananaPeel = {espesor: 0.2, longitud: 3.14};
getLength(bananaPeel);

Utilizando extiende garantiza que T contendrá propiedades definidas por IThingWithLength.

Clases genéricas

Hasta este punto, estábamos trabajando con funciones genéricas, pero no es el único lugar donde brillan los genéricos, veamos cómo podemos incorporarlos a las clases.

En primer lugar vamos a tratar de almacenar racimo de plátanos en la cesta de plátanos:

clase Banana {
  constructor(
    public longitud: número,
    public color: cadena,
    public radiación ionizante: número
  ) {}
}

clase BananaBasket {
  privado bananas: Banana[] = [];

  add(banana: Banana): void {
    this.bananas.push(banana);
  }
}

const bananaBasket = new BananaBasket();
bananaBasket.add(nuevo Banana(3.14, 'rojo', 10e-7));

Ahora vamos a tratar de crear cesta de propósito general, a diferentes cosas con el mismo tipo:

clase Cesta {
  cosas privadas: T[] = [];

  add(cosa: T): void {
    this.stuff.push(cosa);
  }
}

const bananaBasket = nueva Cesta();

Y por último, supongamos que nuestra cesta es un contenedor de material radiactivo y sólo podemos almacenar materia que tenga Radiación ionizante propiedad:

interfaz IRadioactive {
  ionizingRadiation: número;
}

clase RadioactiveContainer {
  privado stuff: T[] = [];

  add(cosa: T): void {
    this.stuff.push(cosa);
  }
}

Interfaz genérica

Por último intentemos reunir todos nuestros conocimientos y construyamos un imperio radioactivo utilizando también Interfaces Genéricas:

// Definir atributos comunes para contenedores
interfaz IRadioactivo {
  ionizingRadiation: número;
}


// Definir algo que es radioactivo
interface IBanana extends IRadioactive {
  longitud: número;
  color: cadena;
}

// Definir algo que no es radioactivo
interfaz IDog {
  peso: número;
}

// Define una interfaz para un contenedor que sólo puede contener cosas radioactivas
interface IRadioactiveContainer {
  add(cosa: T): void;
  getRadioactiveness():número;
}

// Definir clase que implemente la interfaz del contenedor radioactivo
class ContenedorRadioactivo implements ContenedorRadioactivo {
  privado stuff: T[] = [];

  add(cosa: T): void {
    this.stuff.push(cosa);
  }

  getRadioactividad(): number {
      return this.stuff.reduce((a, b) => a + b.ionizingRadiation, 0)
  }
}

// ¡ERROR! El tipo 'IDog' no satisface la restricción 'IRadioactive'
// Y es un poco brutal almacenar perros dentro de un contenedor radioactivo
const perrosContenedor = new ContenedorRadioactivo();

// ¡Todo bien fam!
const radioactiveContainer = new RadioactiveContainer();

// Recuerda clasificar tus residuos radioactivos - crea un contenedor separado sólo para plátanos
const bananasContainer = nuevo RadioactiveContainer();

¡Eso es todo, amigos!

Artículos relacionados

Desarrollo de software

Crear aplicaciones web preparadas para el futuro: ideas del equipo de expertos de The Codest

Descubra cómo The Codest destaca en la creación de aplicaciones web escalables e interactivas con tecnologías de vanguardia, ofreciendo experiencias de usuario fluidas en todas las plataformas. Descubra cómo nuestra experiencia impulsa la transformación...

EL MEJOR
Desarrollo de software

Las 10 mejores empresas de desarrollo de software de Letonia

Conozca las principales empresas de desarrollo de software de Letonia y sus innovadoras soluciones en nuestro último artículo. Descubra cómo estos líderes tecnológicos pueden ayudarle a mejorar su negocio.

thecodest
Soluciones para empresas y escalas

Fundamentos del desarrollo de software Java: Guía para externalizar con éxito

Explore esta guía esencial sobre el desarrollo de software Java outsourcing con éxito para mejorar la eficiencia, acceder a la experiencia e impulsar el éxito de los proyectos con The Codest.

thecodest
Desarrollo de software

La guía definitiva para subcontratar en Polonia

El auge de las outsourcing en Polonia está impulsado por los avances económicos, educativos y tecnológicos, que fomentan el crecimiento de las TI y un clima favorable a las empresas.

TheCodest
Soluciones para empresas y escalas

Guía completa de herramientas y técnicas de auditoría informática

Las auditorías informáticas garantizan sistemas seguros, eficientes y conformes. Obtenga más información sobre su importancia leyendo el artículo completo.

The Codest
Jakub Jakubowicz CTO y Cofundador

Suscríbase a nuestra base de conocimientos y manténgase al día de la experiencia del sector informático.

    Quiénes somos

    The Codest - Empresa internacional de desarrollo de software con centros tecnológicos en Polonia.

    Reino Unido - Sede central

    • Oficina 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polonia - Centros tecnológicos locales

    • Parque de oficinas Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Embajada del Cerebro, Konstruktorska
      11, 02-673 Varsovia, Polonia

      The Codest

    • Inicio
    • Quiénes somos
    • Servicios
    • Case Studies
    • Saber cómo
    • Carreras profesionales
    • Diccionario

      Servicios

    • Asesoramiento
    • Desarrollo de software
    • Desarrollo backend
    • Desarrollo Frontend
    • Staff Augmentation
    • Desarrolladores de backend
    • Ingenieros de la nube
    • Ingenieros de datos
    • Otros
    • Ingenieros de control de calidad

      Recursos

    • Hechos y mitos sobre la cooperación con un socio externo de desarrollo de software
    • De EE.UU. a Europa: ¿Por qué las startups estadounidenses deciden trasladarse a Europa?
    • Comparación de los polos de desarrollo de Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filipinas), Eurasia (Turquía)
    • ¿Cuáles son los principales retos de los CTO y los CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condiciones de uso del sitio web

    Copyright © 2025 por The Codest. Todos los derechos reservados.

    es_ESSpanish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean nl_NLDutch etEstonian elGreek es_ESSpanish