¿Cómo integrar librerías externas desconocidas por TypeScript?
Al desarrollar aplicaciones, especialmente con frameworks como Next.js, es crucial integrar librerías externas eficientes y precisas. Sin embargo, hay bibliotecas como Google Analytics o, en este caso, Possible, que no se instalan de manera tradicional. Su integración pasa meramente por añadir un script en el HTML. Aunque esto suena sencillo, el verdadero desafío surge cuando TypeScript no reconoce estas librerías. Aquí te mostramos cómo gestionarlo.
¿Qué es possible y por qué deberías integrarlo?
Possible es una herramienta similar a Google Analytics que permite monitorear el tráfico del sitio. Para integrarlo, simplemente añadimos un script en el head de nuestra página web. No requiere instalación con NPM. La funcionalidad está disponible en el objeto global Window. Nuestro desafío es hacer que TypeScript reconozca a Possible.
¿Cómo extender el objeto Window en TypeScript?
Para que TypeScript reconozca la nueva propiedad Possible en Window, necesitamos manipular directamente los Types. Sigue estos pasos:
Crea una carpeta para TypeScript: Debemos crear una carpeta Possible dentro de nuestro directorio de Types. Esto asegura que nuestros compañeros de equipo estén al tanto de los cambios.
Define la interface en index.d.ts: Aquí es donde extendemos la interfaz del objeto Window.
// Primera declaración de interfaceinterfaceWindow{Possible:any;}
Esta configuración inicial informa a TypeScript de la existencia de Possible, pero podemos ir más allá para ajustarlo a las funcionalidades específicas de nuestro proyecto.
¿Cómo definir los métodos de possible?
Una vez que TypeScript ha sido informado sobre Possible, debemos modelar su comportamiento real. Si el método Possible recibe un evento string, podríamos configurarlo, por ejemplo, como una función que recibe addFox o removeFox únicamente.
// Definiendo la interface con eventos específicosinterfaceWindow{Possible:(event:'addFox'|'removeFox')=>void;}
¿Qué más funcionalidades puedes añadir?
Al revisar la documentación de Possible, descubrimos más funcionalidades, como un objeto options que incluye un callback y otros parámetros. Podemos ser aún más específicos al definir esta interfaz.
¿Qué beneficios obtienes al usar TypeScript para estas integraciones?
Ventajas de documentar con TypeScript
Claridad y Mantenimiento: Los desarrolladores futuros pueden comprender rápidamente cómo integrar y utilizar estas librerías externas basándose en los tipos definidos.
Prevención de Errores: Al definir los eventos permitidos o las funciones requeridas, evitamos errores comunes y mejoramos la robustez del código.
Codificación Eficiente: La autocompletación en los editores ayuda a los desarrolladores a ser más eficientes al escribir código.
Conclusión
Al extender la funcionalidad del objeto Window en TypeScript y ser específicos en nuestra implementación, no solo logramos un código más seguro, sino que también documentamos el proyecto de manera efectiva para otros programadores. TypeScript no solo es un lenguaje, es una herramienta poderosa que fomenta prácticas de programación más cuidadosas y eficientes.
¡Sigue explorando y perfeccionando tus habilidades en TypeScript, estamos seguros de que te llevará a escribir un código de calidad excepcional!
Luego tenemos la carpeta de types
types->plausible->index.d.ts
type Options={ callback?:()=>void; props?:Record<string, string | number |undefined>;};interfaceWindow{plausible:(event:"add_fox"|"remove_fox", options?:Options)=>void;}
Al momento de tipar la funcion plausible dentro del objeto Window, opte por usar enum. Los enums son similares a los types, permiten definir un conjunto de constantes con nombre.
enumPlausibleEvents{ADD_FOX='add_fox',REMOVE_FOX='remove_fox'}type Options={ callback?:()=>void;props:Record<string, string | number |undefined>;}interfaceWindow{plausible:(event:PlausibleEvents, options?:Options)=>void;}
Ahora, en el archivo index.tsx debemos enviar en argumento a la función de la siguiente forma (Normalmente toca importar el enum, pero como esta dentro de la carpeta @types queda de forma global):
window.plausible(PlausibleEvents.ADD_FOX)
Excelente, lo habia pensado igual
Trabajando con librerías que extienden el objeto window
Tambien podemos extender el objeto windows por ejemplos cuando utilizamos librerias como Plausible que es similar a google analitycs. Esta libreria solo nos pide que agreguemos un script a nuestro HTML
Pero si queremos hacer seguimiento a la interaccion de un boton para obtener analiticas, debemos llamar a la funcion plausible('add_fox') El problema es que typescript no dabe que existe esta funcion dentro de windows. Entonces nosotros podemos crear un directorio con los tipos: @types dentro de este directorio colocaremos otro directorio con el nombre de la libreria y en su interior un archivo index.d.ts
Al definir una interface con el mismo nombre que un objeto que ya existe, typescript lo va a extender, y le va a agregar la propiedad plausible, la cual podemos tipar segun lo que nos indique la libreria que deberia recibir.
¿Alguien sabe por qué al darle click a "Add new Fox" me dice que "window.plausible" no es una function?¿Esta relacionado más con JavaScript o con TypeScript?
Hay alguna manera de instalar con npm las interfaces de plausible en lugar de definirlas manualmente nosotros mismos?
Es por esto mismo que me encanta Java ☕, los tipos son potentes y ahorran tanto tiempo.
Me siento poderoso
No exageres hijito
🌍 Extender el objeto window en TypeScript
Existen plugins y scripts que extienden el objeto global window añadiendo nuevos métodos o propiedades.
Es importante saber cómo decirle a TypeScript, de forma correcta y óptima, que estos métodos sí existen y que vamos a utilizarlos 👌.
Vamos a verlo con un ejemplo real: Plausible, una alternativa ligera a Google Analytics 📊✨.
📦 ¿Qué es Plausible en este contexto?
🔹 Funciona agregando un script en el <Head>
❌ No se instala vía npm
❌ No es una dependencia del proyecto
✅ Expone una función global: window.plausible
Una vez cargado el script, podemos usarlo directamente:
Por defecto, el objeto windowno tiene ese método tipado.
👉 Resultado: error de TypeScript ❌
✅ Solución correcta: extender Window
Como no se trata de una dependencia, sino de extender un objeto global, debemos declarar el tipo nosotros mismos.
📁 Estructura recomendada
Creamos una carpeta de tipos:
@types/ └── plausible/ └── index.d.ts
🧩 Declaración básica
Dentro de index.d.ts:
interfaceWindow{plausible:(event: string)=>void;}
📌 Con esto:
TypeScript reconoce window.plausible
El error desaparece
El método es accesible globalmente
🎯 Tipado avanzado (mejor DX)
Podemos ir más lejos y tipar exactamente cómo funciona Plausible, incluyendo:
Eventos permitidos
Parámetros opcionales
Callbacks
Props dinámicas
type Options={ callback?:()=>void;props:Record<string, string | number |undefined>;};interfaceWindow{plausible:(event:"add_fox"|"remove_fox", options?:Options)=>void;}
✨ Beneficios inmediatos
🧠 Autocompletado de eventos
🧪 Tipado de opciones y callbacks
🚫 Menos errores
📚 No necesitas abrir la documentación externa
🛡️ Código más confiable
📖 TypeScript como documentación viva
Gracias a este tipado:
TS no solo valida
TS documenta
TS guía a quien mantenga el código
TS mejora la DX (Developer Experience) 🚀
💡 Otros desarrolladores podrán entender cómo usar window.plausiblesimplemente leyendo los tipos, sin buscar documentación externa.
🏁 Conclusión
🧩 Los scripts globales suelen extender window
⚠️ TS no los reconoce automáticamente
✅ Se solucionan extendiendo la interfaz Window
📄 Los .d.ts son el lugar correcto
✨ Un buen tipado convierte a TS en documentación del proyecto
TypeScript no solo nos ayuda a escribir código con más confianza,
nos empuja a escribir código mejor pensado, más mantenible y más profesional 💪😄
¿A alguien más le manda error 403 cuando se quieren registrar en plausible?
Creo que ya funciona de nuevo
¿Qué estrategias puedes seguir si la librería externa (como Possible) cambia su API y no existe documentación oficial para actualizar los tipos en TypeScript?
esta seccion es exelente ! ensenia a como abordar retos en el mundo real !