Programación genérica
Tags: typescript, generics, angular, programming
Published: 2021-02-18 18:04:35

# Programación Genérica

Alguna vez has escuchado sobre este término, que son los **genéricos** dentro de un lenguaje de programación, si tu respuesta es sí y no sabes que es, en esta publicación vamos a explicar y dejarlo en claro.

Antes de empezar hay que mencionar que la programación genérica existe en varios lenguajes de programación y no es exclusivo solamente de uno, algunos lenguajes que hacen uso de estos son los siguientes, por mencionar algunos:

**· C#**

**· Java**

**· Typescript**

**· Etc.…**

## **Pero ¿Qué es?**

Es un tipo de programación en el que los algoritmos se escriben en tipos ****que se especificaran más adelante y que luego se instancian cuando es necesario.

La idea de esta forma de programar es generalizar los algoritmos utilizados para que puedan usarse en más de una ocasión.

**Por ejemplo**, podemos tener una clase que solo maneja números (en términos genéricos), y solo al momento de instanciar la clase se especifica el tipo de número como **Integer**, **Float** o **Double**.

# **Sintaxis**

La sintaxis de un genérico es la siguiente (los ejemplos los haremos con el lenguaje **Typescript**):

![Sintaxis](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z24u088lam7cyu4zj9fp.png)

Estamos declarando una interface que se llama **TreeNode** y entre los signos de **menor qué** y **mayor qué** estamos poniendo la letra **T.**

La **T** (**type o tipo**) es una convención, pero puedes usar cualquier letra que tú decidas y hace referencia al tipo de dato que le vamos a pasar al momento de utilizar nuestra interface.

Si observamos dentro de nuestra interface tenemos declarando una propiedad llamada **value** de tipo **T,** esto quiere decir que el tipo que le pasemos dentro de los signos (**< >**) va hacer el tipo de nuestra propiedad.

Al momento de utilizar nuestra interface quedaría de la siguiente manera:

![Ejemplo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdw3fkcdpjydttq0jtwa.png)

Creamos una constante que está usando la interface que hicimos anteriormente y como vez dentro de **menor que** y **mayor que** le estamos pasando que va hacer de tipo numérico (**type number**), por ende el valor de nuestra propiedad debe de ser del mismo tipo.

En caso de que le pasemos otro tipo a nuestra propiedad que no sea numérico, por ejemplo un **string** nos lanzaría el siguiente error:

![Error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rc9ttdhp61mzhvi39y9b.png)

Los genéricos no solo podemos utilizarlos dentro de las interfaces sino también podemos hacer uso de ellos dentro una clase, dentro de una **función** o dentro de un **type**.

[Los type nos permite definir el tipo de dato que vamos a usar en nuestras propiedades y métodos; pero a diferencia de las interfaces no podemos extender un type, ni ampliar sus capacidades.](https://vanessamarely.medium.com/intro-a-typescript-fad0cc0c146b)

Veamos unos ejemplo extras para que nos quede más claro el uso de los genéricos.

Miremos la siguiente función:

![Función Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8i7rfq94s5h19chqjqd5.png)

Esta función recibe un arreglo como parámetro que puede ser del tipo que nosotros le indiquemos y nos regresa la primera posición de dicho arreglo. Si notan en esta función reemplazamos la letra T por una A, esto para ver que no estamos obligados a usar solamente la letra T.

![Función Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dze75se7rc9udkvnu7a2.png)

Para usar nuestra función se vería así y como vemos esta vez no le pasamos el tipo de dato pero **Typescript** es lo suficientemente inteligente que infiere el tipo de dato. Nos detecta que es un arreglo de tipo numérico y que retorna un valor numérico.

O para que quede más claro podemos especificar el tipo de dato, como se muestra a continuación:

![Función Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9zylzndn7t1sc5v9pnid.png)

También podemos simplificar nuestra función haciendo uso de las **arrow function** y nos quedaría de la siguiente manera.

![Función Flecha Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hf05sdb9vdy4ms6bxcrk.png)

Por ultimo veamos este último ejemplo que es una función que va a recibir dos parámetros y la función nos retornara un verdadero o falso dependiendo si los tipos de los datos son iguales o diferentes.

![Función Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpd83jt5emzt042aar3l.png)

Para usar nuestra función seria de la siguiente manera:

![Función Genérica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lfq1vz5ojm07l0cbj56c.png)

Estamos llamando a nuestra función **compareTypes** y le estamos pasando como primer parámetro un tipo **string** y como segundo un tipo **boolean**, esto nos retornaría un **false** ya que no cumple con la condición.

En caso que le pasemos dos tipos iguales (dos **string**, dos **booleanos**, dos tipos **numéricos**, etc.) nos devolverá un **true**.

# **Conclusión**

Como vemos hacer uso de los genéricos en Typescript como en otros lenguajes es muy sencillo y además tienen muchos beneficios y ventajas pero el principal de ellos es la **reutilización de código**.

[Si quieres saber un poco más te dejo un enlace a la documentación oficial de **Typescript** para que puedas leer un poco más.](https://www.typescriptlang.org/docs/handbook/generics.html)

**Ahora si a poner en práctica y hacer uso de genéricos.**