Creación de Componentes Genéricos con TypeScript y Lazy Loading

Clase 11 de 16Curso de React.js con TypeScript

Resumen

¿Cómo hacer componentes genéricos en TypeScript?

TypeScript se ha convertido en una herramienta esencial para desarrollar componentes genéricos dentro de aplicaciones web modernas. El poder definir atributos de manera precisa, facilitar la reutilización de componentes, y evitar errores gracias a su tipado fuerte, son solo algunos de sus beneficios. En este contenido, exploraremos cómo extender un componente para incluir las propiedades de elementos nativos HTML, haciéndolo más robusto y versátil.

¿Qué estrategia seguir para definir componentes con propiedades nativas?

Crear componentes que soporte cada una de las propiedades de un elemento HTML nativo sin definirlas una a una es un desafío común. Sin embargo, existe una manera más eficiente de lograrlo:

  • Utilizar los tipos del DOM de TypeScript: La biblioteca de TypeScript incluye tipos que ya definen cómo debería estructurarse un elemento del DOM, permitiendo extender componentes sin esfuerzo excesivo.
  • Importar tipos desde React: Es posible acceder a estos tipos desde React, simplificando el proceso. Por ejemplo, los atributos de un tag <img> pueden ser implementados sin repetir código.
import { ImgHTMLAttributes } from "react";

// Definir tipos nativos para una imagen
type ImageNativeTypes = ImgHTMLAttributes<HTMLImageElement>;

// Combinar los tipos nativos con otros propios del componente
type LazyImageProps = {
  src: string;
} & ImageNativeTypes;

¿Cómo manejar eventos y atributos adicionales en un componente extendido?

TypeScript permite agregar atributos genéricos mediante el uso del operador de propagación, haciendo que los eventos como onClick, y otros atributos, se manejen automáticamente.

  • Implementación del operador de propagación: Captura todos los atributos adicionales que se pasen al componente y los transfiere al elemento HTML interno.
const LazyImage = ({src, ...imgProps}: LazyImageProps) => {
  return (
    <img src={src} {...imgProps} />
  );
};

Este enfoque garantiza que cualquier atributo pasado al componente, como onClick, title, className, entre otros, funcione sin necesidad de especificarlo manualmente en el tipo del componente.

¿Por qué es importante seguir convenciones al definir propiedades?

Adoptar convenciones estándar al construir APIs de componentes con TypeScript no solo promueve la legibilidad y mantenimiento del código, sino que facilita la integración y colaboración en equipos de desarrollo. Aquí algunas razones:

  • Facilidad de adopción: El uso de propiedades nativas permite que otros desarrolladores en el equipo usen el componente sin necesidad de aprender nuevas configuraciones.
  • Mantenimiento y escalabilidad: Al imitar componentes nativos, se reduce al mínimo la curva de aprendizaje y se mejora la escalabilidad del proyecto.

Es en este contexto que pasar de una propiedad personalizada como image a una nativa como src puede parecer un cambio menor, pero en realidad promueve una interoperabilidad más fluida y sencilla dentro de los equipos.