Repaso de tipos básicos y complejos en TypeScript. Qué son los genéricos y la conversión de tipos.
En TypeScript, al igual que en JavaScript, existen tipos primitivos que representan datos simples y básicos. Veamos los tipos primitivos principales en TypeScript con ejemplos de código:
Representa valores numéricos, ya sean enteros o decimales.
Son valores de texto o cadenas de caracteres (strings en inglés).
Representa valores lógicos, verdadero true o falso false.
Son tipos que tienen valores null (un valor asignado) y undefined (variable declarada pero si definir ningún valor).
Representa valores únicos e inmutables utilizados como identificadores de propiedad en objetos. Introducidos en ECMAScript 2015 (ES6).
Representa valores enteros mayores que 2^53 - 1 o menores que -(2^53 - 1).
Estos son algunos de los tipos primitivos básicos en TypeScript que se utilizan para definir variables y estructuras de datos simples en el código.
# Tipos Complejos en TypeScript
Los tipos complejos en TypeScript permiten representar y trabajar con estructuras de datos más sofisticadas y flexibles, lo que proporciona un mayor nivel de seguridad y claridad en el desarrollo de aplicaciones. Aquí te muestro algunos de los tipos complejos principales con ejemplos de código:
Representa una colección ordenada de elementos del mismo tipo.
Una tupla es un array de longitud fija que permite definir tipos específicos para cada posición.
Representa un objeto genérico con propiedades y valores.
Representa un tipo dinámico que puede tomar cualquier valor.
Permite definir variables que pueden contener más de un tipo.
Permite definir un conjunto de constantes nombradas.
En TypeScript, tanto type como interface son herramientas que permiten definir estructuras de datos personalizadas. Aunque pueden parecer similares en algunos aspectos, tienen diferencias en su funcionamiento y uso. Veamos cada uno de ellos:
type es una forma de definir un alias para un tipo existente o crear un nuevo tipo a partir de una combinación de otros tipos. Esto permite reutilizar tipos existentes o crear nuevos tipos basados en composiciones, uniones, intersecciones u otras operaciones con tipos.
Ejemplo:
En el ejemplo anterior, Punto
es un tipo que combina las propiedades de Coordenada
y agrega una propiedad adicional color
. Los tipos pueden ser usados para definir tipos más complejos y reutilizables.
interface, por otro lado, se utiliza principalmente para definir la forma de una estructura de datos. Es una forma de declarar contratos que los objetos deben cumplir. Las interfaces son más adecuadas para definir la forma de un objeto y permiten la herencia entre interfaces para extender su comportamiento.
Ejemplo:
En este ejemplo, Punto
es una interfaz que extiende la interfaz Coordenada
, agregando la propiedad color
. Las interfaces también pueden ser implementadas por clases para garantizar que la clase cumpla con la estructura definida por la interfaz.
Extensibilidad: Las interfaces pueden ser extendidas por otras interfaces, lo que permite crear jerarquías de interfaces. Los tipos type no admiten herencia directa, aunque se pueden crear tipos compuestos y utilizarlos de manera similar.
Declaración vs. composición: Las interfaces son principalmente para la declaración de formas de objetos, mientras que los tipos type son más flexibles y pueden ser usados para definir tipos compuestos, uniones, intersecciones y otros tipos más complejos.
En la práctica, la elección entre type e interface depende del escenario particular y las necesidades del desarrollo. A menudo, ambas pueden ser utilizadas en conjunto para beneficiarse de las diferentes características que ofrecen. Es importante entender sus diferencias y utilizarlas de manera efectiva.
Los genéricos (generics) es un término en TypeScript que sirve para describir la característica que permite escribir código flexible y reutilizable al trabajar con tipos de datos. Permiten la creación de componentes que pueden funcionar con una variedad de tipos sin perder la información de tipo durante la ejecución.
Los genéricos se definen utilizando el símbolo <T>
, donde T
es una variable de tipo. Estos tipos pueden ser utilizados dentro de funciones, clases y otros constructores para proporcionar flexibilidad en la elección de tipos. Por ejemplo, la función identidad soporta varios tipos:
Puedes utilizar varias variables de tipo genérico en una función para trabajar con múltiples tipos.
Las clases también pueden hacer uso de generics para proporcionar flexibilidad en la elección de tipos.
Una clase puede tener múltiples variables de tipo genérico.
Las Type assertions o conversión de tipos, también conocidas como "casting", son una característica presente en muchos lenguajes de programación como Java o C#. También está presente en TypeScript. Básicamente sirve para ayudar al compilador a determinar un tipo específico a un valor cuando este no puede determinarlo por si mismo.
La sintaxis básica de una Type Assertion es utilizar el operador as
o la notación <>
. Aquí hay ejemplos de ambas formas:
El uso de Type assertions se vuelve útil en situaciones como:
En este caso, miVariable
se declara como tipo any
, pero el desarrollador sabe que, en este contexto específico, su valor será una cadena de texto (string). La Type Assertion le permite a TypeScript tratar miVariable
como una cadena, permitiendo el acceso a la propiedad length
.
Aunque las Type assertions pueden ser útiles en ciertos escenarios, es importante usarlas con precaución para evitar situaciones de ejecución impredecibles. Veamos las mejores prácticas:
Utilízalas sólo cuando sea necesario
Evita Type assertions con any
any
, ya que esto anula gran parte de la seguridad de tipo proporcionada por TypeScript.Usa Type Guards cuando sea posible
Las Type assertions pueden ser valiosas en ciertos escenarios, pero es crucial utilizarlas con responsabilidad y considerar alternativas más seguras cuando sea posible. Esto ayuda a mantener la integridad del sistema de tipos de TypeScript y a prevenir errores difíciles de depurar.
En este artículo hemos visto los tipos básicos de TypeScript, los tipos complejos, qué son los genéricos y la conversión de tipos. Comprender todos estos términos no solo nos ayudará a mejorar la calidad del código, sino que también nos abre la puerta a prácticas de desarrollo más avanzadas y eficientes para el desarrollo de nuestras aplicaciones con TypeScript.
Si quieres profundizar más sobre tipos puedes visitar la documentacion oficial.