Los tipos de datos en TypeScript representan una herramienta poderosa para estructurar información de manera eficiente. A diferencia de otros elementos del lenguaje, los types tienen características únicas que los hacen especialmente útiles para el desarrollo de aplicaciones robustas. Aunque no se traducen directamente a JavaScript, su valor en la fase de desarrollo es incalculable para mantener la integridad de los datos.
¿Qué son los types en TypeScript y por qué son tan especiales?
Los types en TypeScript son una forma de estructurar datos que, curiosamente, no tienen equivalencia directa en JavaScript. Esto significa que puedes utilizarlos ampliamente durante el desarrollo, pero al compilar tu código a JavaScript, estos desaparecen sin dejar rastro, a menos que crees un objeto basado en ellos.
Para entender mejor este concepto, podemos crear un archivo básico:
La diferencia fundamental entre un type y una clase es que el type solo puede tener propiedades, mientras que una clase puede tener tanto propiedades como métodos y constructor. Los types sirven principalmente para estructurar datos de manera clara y consistente.
Al compilar este código a JavaScript, notarás algo sorprendente: solo la clase se traduce al archivo resultante, mientras que el type simplemente desaparece. Esto demuestra que los types son herramientas exclusivas de TypeScript para la fase de desarrollo.
¿Cómo aprovechar los mapped types para transformar estructuras de datos?
Los mapped types son una característica avanzada que permite transformar tipos existentes siguiendo patrones específicos. Son especialmente útiles cuando necesitas crear variaciones de un tipo base.
Types parciales
Puedes crear un tipo que haga que todas las propiedades de otro tipo sean opcionales:
Para utilizar estos tipos en código que se compile a JavaScript, necesitas crear objetos basados en ellos:
const persona:PersonaSoloLectura={ nombre:"Min", edad:30};console.log(persona.nombre);// Esto sí se compilará a JavaScript
¿Qué otros tipos avanzados ofrece TypeScript?
TypeScript proporciona varios tipos avanzados que aumentan significativamente la expresividad y seguridad del código.
Template literal types
Estos tipos permiten crear variantes basadas en cadenas literales:
typeVariantes="pequeño"|"mediano"|"grande";typeClaseCSS=`boton-${Variantes}`;// let botonPequeño: ClaseCSS = "boton-pequeño";// let botonMediano: ClaseCSS = "boton-mediano";// let botonGrande: ClaseCSS = "boton-grande";
Los template literal types son perfectos para trabajar con convenciones de nomenclatura consistentes, como clases CSS o identificadores de elementos.
Conditional types
Los tipos condicionales permiten realizar evaluaciones y determinar el tipo resultante basado en condiciones:
typeEsNumero<T>=Textendsnumber?true:false;functionesNumero<T>(valor:T):EsNumero<T>{return(typeof valor ==="number")asany;}const resultado1 =esNumero(42);// trueconst resultado2 =esNumero("hello");// falseconsole.log(resultado1);console.log(resultado2);
Este ejemplo demuestra cómo los tipos condicionales pueden utilizarse para validar datos antes de enviarlos a una base de datos o servicio, mejorando la robustez de las aplicaciones.
Los types en TypeScript representan una herramienta fundamental para garantizar la integridad de los datos en tus aplicaciones. Aunque no se traducen directamente a JavaScript, proporcionan una capa adicional de seguridad durante el desarrollo que ayuda a prevenir errores comunes. ¿Has utilizado types en tus proyectos? Comparte tu experiencia y cómo han mejorado tu flujo de trabajo en los comentarios.
No había entendido muy bien este tema de los tipos mapeados, pero me ayudó mucho pensar en ellos como un copiador/creador de tipos con modificaciones.
Por ejemplo si tienes un tipo base:
type Persona={name: string;age: number;isDeveloper: boolean;};
Y quieres crear un nuevo tipo donde todas las propiedades sean string, puedes hacer esto:
type PersonaComoTexto={[Kin keyof Persona]: string;};<!--Resultado: type PersonaComoTexto={name: string;age: string;isDeveloper: string;}-->
Como segundo ejemplo, el profesor mostró este tipo genérico que no había entendido:
type Parcial<T>={[Kin keyof T]?:T[K];};
Al reemplazar T por Persona, quedaría así:
type PersonaOpcional={[Kin keyof Persona]?:Persona[K];};
Esto lo que hace es copiar todas las claves de Persona (name, age, isDeveloper) y marcar cada una como opcional, manteniendo el tipo de dato original.
<!--Resultado: type PersonaOpcional={ name?: string; age?: number; isDeveloper?: boolean;}-->
Y para entender la parte de Persona[K], lo que hace es buscar el tipo de la clave K dentro de Persona. Si K es name, va a Persona y obtiene su tipo (string), y así con las demás.
Entonces, con los tipos mapeados estás copiando un tipo, pero aplicándole una modificación específica, como volver todo opcional, de solo lectura o cambiar los tipos.
¡Gracias!
Gran aporte, ahora lo entiendo mucho mejor! Gracias!
los tipos (type) son una forma de definir alias o estructuras de datos que pueden ser reutilizados en tu código. A diferencia de las interfaces, los tipos son más flexibles y pueden representar una amplia variedad de estructuras, como uniones, intersecciones, tipos primitivos, y más.
¿Cuándo usartype?
Cuando necesitas uniones, intersecciones o tipos condicionales.
Para definir alias de tipos primitivos o estructuras complejas.
Cuando trabajas con funciones o tuplas.
En escenarios donde la flexibilidad es más importante que la extensibilidad.
No queda claro el uso de tipos condicionales, me parece que es más simple escribir el ejemplo así:
function esNumero<T>(valor: T): boolean{
return (typeof valor === 'number') ? true : false;
}
Cuál sería el beneficio en este caso o que otro ejemplo podría usar un tipo condicionado. Gracias.
Los types son como crear mi propio tipo de dato? O entendi mal?
Exacto, Gonzalo. Básicamente estás definiendo un contrato personalizado para que TypeScript sepa exactamente qué forma debe tener tu información. Es como crear tus propias piezas de Lego en lugar de usar siempre las estándar.
Si ya tienes tipos básicos como string o number.
Disculpen la ignorancia, es que tengo una confusión y es con respecto a 3 temas: los type, las interfaces y la clase abstracta. Yo lo entiendo como conceptos similares, o sea, cada uno es un molde que se implementa luego en la creación de un objeto o en la implementación de una interfaz. ¿Podrían ayudarme a entender estos tres conceptos, por favor?
Ok, veamos:
Los types son alias de tipos, los puedes usar para definir la forma de un objeto o unión de tipos.
Las interfaces también definen la forma de un objeto pero se pueden extender de otra interface y las puedes usar muy bien en programación orientada a objetos.
Las clases abstractas no solo te permiten definir propiedades sino también métodos que puedes implementar y llamar desde otro lado.