Saltar al contenido
SvgJsx
Idioma: Español

SVG a TSX: componentes de iconos tipados para React

Genera componentes de React en TypeScript a partir de SVG con los tipos de props correctos, para que cada icono acepte className, atributos aria y manejadores de eventos con autocompletado completo.

Ajustes rápidos:
Suelta archivos .svg aquí oLos archivos se leen localmente con FileReader y nunca se suben.
Opciones
Exportación:
import type { SVGProps } from "react";

const HeartIcon = (props: SVGProps<SVGSVGElement>) => (
  <svg width="24" height="24" viewBox="0 0 24 24" className="icon icon-heart" {...props}>
    <g id="Layer_1" fill="none" stroke="#e11d48" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
      <path d="M19.0001 14.0002c1.4900-1.4600 3.0000-3.2100 3.0000-5.5000A5.5000 5.5000 0 0 0 16.5000 3c-1.7600 0-3.0000.5000-4.5000 2-1.5000-1.5000-2.7400-2-4.5000-2A5.5000 5.5000 0 0 0 2 8.5000c0 2.3000 1.5000 4.0500 3 5.5000l7 7Z" style={{ fillOpacity: "0.15", fill: "#e11d48" }} />
    </g>
  </svg>
);

export default HeartIcon;

Vista previa

Vista previa del SVG convertido
SVG original
706B
SVG optimizado
538B(-24 %)
Componente
631B

Cómo funcionan los tipos generados

Las props del componente se tipan como SVGProps<SVGSVGElement>, el mismo tipo que React usa para el elemento <svg>. Así obtienes autocompletado para todos los atributos SVG y manejadores de eventos, y TypeScript rechazará props no válidas en tiempo de compilación.

Con la opción size activada, las props pasan a ser SVGProps<SVGSVGElement> & { size?: number | string }, y width y height se toman de size. Con forwardRef activado, la ref se tipa como Ref<SVGSVGElement>, de modo que los padres pueden adjuntar refs para medir o para librerías de animación.

Lista de comprobación del resultado TSX

Antes de hacer commit de un icono generado, comprueba que:

  • El nombre del componente está en PascalCase y coincide con el nombre del archivo (ArrowLeft.tsx).
  • SVGProps y Ref se importan solo como tipos, por lo que desaparecen del bundle de JavaScript.
  • El viewBox está presente; sin él, el icono no puede escalar.
  • Se usan exportaciones con nombre si tu base de código prohíbe las exportaciones por defecto.

Compatible con el modo estricto

El código compila con "strict": true y con isolatedModules, que exigen Next.js, Vite y esbuild. No se genera ningún tipo any, y el valor por defecto de size se escribe como valor literal en el patrón de desestructuración.

Preguntas frecuentes

¿Debo usar SVGProps o ComponentProps<"svg">?

Ambos describen los mismos atributos. SVGProps<SVGSVGElement> es explícito sobre el tipo de elemento y es el que usan las propias definiciones de tipos de React para <svg>, así que el convertidor lo utiliza.

¿Sigue importando forwardRef en React 19?

React 19 permite que los componentes de función reciban ref como una prop normal, así que ahí forwardRef es opcional. Sigue siendo útil para librerías que deben dar soporte a React 18; por eso es una opción desactivada por defecto.

¿Por qué la prop size es de tipo number | string?

Los números se interpretan como píxeles, mientras que las cadenas permiten unidades CSS como "1em" o "1.5rem" para que el icono escale con el texto que lo rodea.

¿Puedo convertir una carpeta entera de iconos a TSX?

Sí. Suelta todos los archivos a la vez; cada uno se convierte en un archivo .tsx con el nombre del SVG, empaquetado en un ZIP con un archivo barrel index.ts.