TypeScript en Astro e integraciones
El soporte de TypeScript integrado en Astro: heredar el rigor de los tsconfig oficiales, los tipos generados en la carpeta .astro con astro sync, tipar props con interface Props, y añadir integraciones con astro add.
Astro trae TypeScript de fábrica: no necesitas configurar nada para escribir tipos, y buena parte de la seguridad la genera el propio framework a partir de tu proyecto. Entender de dónde salen esos tipos —los tsconfig que heredas, la carpeta .astro que Astro rellena, las props que declaras— convierte al editor en un copiloto que caza errores antes de que existan.
- Configurar el rigor de TypeScript extendiendo los
tsconfigoficiales de Astro. - Entender los tipos generados en la carpeta
.astroy regenerarlos conastro sync. - Tipar las props de un componente con
interface Propsy consumirAstro.props. - Añadir integraciones con
astro addy saber exactamente qué modifica por ti.
tsconfig: heredar el rigor de Astro
Astro publica tres configuraciones base de TypeScript, y tu tsconfig.json extiende una de ellas en vez de definir decenas de opciones a mano. Elegir cuál es elegir cuánto rigor quieres que el compilador te imponga.
astro/tsconfigs/base
Lo mínimo para que Astro entienda el proyecto. Permisiva: sin comprobaciones estrictas. Para prototipos o migraciones graduales.
astro/tsconfigs/strict
El equilibrio recomendado y el que trae la plantilla por defecto. Activa strict sin llegar a los extremos.
astro/tsconfigs/strictest
Máximo rigor: cada laguna de tipos se convierte en error. La opción de quien quiere garantías fuertes desde el inicio.
La recomendación es empezar en strict y subir a strictest cuando el proyecto madure; bajar a base solo tiene sentido al migrar código viejo que aún no pasa las comprobaciones. Cambiar de nivel es tan simple como editar una línea:
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}
Fíjate en el include: incorpora .astro/types.d.ts, el fichero de tipos que Astro genera. Sin esa línea, tu editor no vería los tipos del framework ni los de tu contenido. La plantilla lo pone por ti; si tocas el tsconfig, no lo borres.
Junto al tsconfig verás a veces un src/env.d.ts con una referencia a los tipos de cliente de Astro. Es el punto donde el proyecto engancha los tipos globales del framework —los de import.meta.env, los assets, los módulos virtuales—. No necesitas tocarlo, pero saber que existe explica de dónde salen tipos que nunca declaraste.
TypeScript en Astro es puramente una capa de desarrollo: los tipos se comprueban al editar y en astro check, pero se borran al compilar. No añaden un solo byte al sitio publicado. Ganas seguridad y autocompletado sin pagar nada en el cliente, que es exactamente la filosofía de Astro aplicada a los tipos.
Tipos generados: astro sync y la carpeta .astro
Parte de los tipos no los escribes tú ni los trae Astro fijos: los genera el framework a partir de tu proyecto. Cuando defines una colección de contenido con su esquema, Astro deduce el tipo exacto de cada entrada; cuando declaras variables de entorno tipadas, genera su interfaz. Todo eso aterriza en la carpeta .astro, que no editas nunca y que conviene ignorar en git.
npx astro sync
# regenera los tipos en .astro/ a partir de tu contenido,
# tus esquemas y tus variables de entorno
astro sync se ejecuta solo antes de dev y build, así que casi nunca lo lanzas a mano. Lo haces cuando cambias un esquema de colección y el editor sigue mostrando el tipo viejo: un astro sync refresca .astro sin necesidad de arrancar el servidor. Es el puente que mantiene tus tipos sincronizados con la realidad de tu contenido.
El efecto se nota al consumir contenido: cuando llamas a getCollection sobre una colección, lo que recibes está tipado según su esquema. Si el esquema dice que cada entrada tiene un titulo de texto y una fecha, el editor lo sabe, autocompleta esos campos y protesta si escribes uno que no existe. No has añadido ni una anotación de tipo: la seguridad brota del esquema que ya declaraste.
import { getCollection } from 'astro:content';
// cada entrada esta tipada segun el esquema de la coleccion
const posts = await getCollection('blog');
const titulo = posts[0].data.titulo; // string, con autocompletado
flowchart LR SCHEMA[esquemas de coleccion] --> SYNC[astro sync] ENV[variables de entorno] --> SYNC SYNC --> GEN[carpeta .astro con tipos] GEN --> ED[autocompletado en el editor] GEN --> CHK[astro check valida] style SYNC fill:#89b4fa,color:#11111b style ED fill:#a6e3a1,color:#11111b
No edites nada dentro de .astro ni la subas a git: es un artefacto que Astro reescribe en cada sync. Si ves tipos raros o desactualizados, no la corrijas a mano —bórrala y deja que un astro sync la regenere—. Tratarla como código fuente es una fuente segura de confusión.
Tipar componentes: interface Props
Dentro de un componente .astro, las props que recibe se tipan declarando una interfaz llamada Props. Astro reconoce ese nombre por convención y tipa automáticamente Astro.props, de modo que quien use el componente recibe autocompletado y errores si pasa algo incorrecto.
---
interface Props {
titulo: string;
destacado?: boolean;
}
const { titulo, destacado = false } = Astro.props;
---
<h2 class={destacado ? 'es-destacado' : ''}>{titulo}</h2>
La interfaz declara el contrato: titulo es obligatorio y de tipo texto, destacado es opcional. Al desestructurar Astro.props puedes dar valores por defecto, como destacado = false. A partir de ahí, si otra página escribe el componente y olvida titulo, el editor y astro check lo marcan. Es la misma seguridad de un componente de React o Vue, sin salir de .astro.
El tipado se propaga hacia arriba: como Astro.props conoce la forma exacta, cualquier página que use el componente recibe autocompletado de sus props y un error si pasa un tipo incorrecto o se deja uno obligatorio. Y no se detiene en las props; dentro del frontmatter, Astro.params, Astro.request y el resto del objeto Astro están tipados, así que el editor te guía también al leer parámetros de ruta o cabeceras.
Integraciones: astro add en profundidad
Añadir una integración a mano implica tres pasos frágiles: instalar el paquete, importarlo en astro.config.mjs y registrarlo en el array integrations sin romper la sintaxis. astro add los ejecuta por ti y te enseña el diff antes de tocar nada.
npx astro add tailwind
# instala la integracion y sus dependencias
# edita astro.config.mjs anadiendo el import y la entrada en integrations
# crea o ajusta ficheros de configuracion propios de la integracion
# todo previa confirmacion, mostrando los cambios
Conviene distinguir dos conceptos que se confunden. Una integración de Astro engancha en los hooks del framework —renderizar un framework de UI, generar un sitemap, procesar estilos— y se registra en integrations. Un plugin de Vite opera una capa más abajo, sobre el bundler, y se declara en la clave vite. astro add gestiona lo primero; lo segundo lo tocas a mano cuando necesitas bajar al pipeline, como viste en la lección de configuración.
Cuando ejecutas astro add, el comando toca hasta tres sitios por ti, siempre mostrándote el diff antes:
package.json, al instalar el paquete de la integración y sus dependencias.astro.config.mjs, añadiendo el import y la entrada en el arrayintegrations.tsconfig.jsono ficheros propios de la integración, cuando esta los necesita.
Aunque sepas editar astro.config.mjs, deja que astro add lo haga siempre que exista soporte para la integración. No solo evita erratas: al añadir un adapter también ajusta output, y al añadir ciertas integraciones actualiza tu tsconfig con los tipos que necesitan. Reproducir todo eso a mano es más trabajo y más superficie de error, sin ninguna ventaja.
La lección profunda de TypeScript en Astro es que los tipos más valiosos no los escribes: los genera el framework a partir de la verdad de tu proyecto. Defines un esquema de colección una vez, y Astro deriva de él el tipo exacto de cada entrada de contenido; declaras una variable de entorno, y aparece su interfaz. Esta idea —tipos como subproducto de la configuración, no como duplicado manual de ella— invierte la relación habitual con TypeScript, donde tú describes formas que el compilador vigila. Aquí la fuente de verdad es única: el esquema, la config, la interfaz Props. De ahí fluye el tipo, y astro sync es simplemente la bomba que mantiene ese flujo al día en la carpeta .astro. La consecuencia práctica es una coherencia difícil de romper: no puedes desincronizar tu contenido de sus tipos, porque los tipos son una proyección de tu contenido. Y la misma filosofía gobierna astro add: en lugar de pedirte que edites config y tipos por separado y confíes en no equivocarte, el CLI trata la configuración como la fuente y deriva de ella todo lo demás —el import, la entrada del array, los tipos del tsconfig—. En Astro, la seguridad de tipos no es una capa que montas encima del proyecto: es una cosecha de la estructura que ya declaraste. Tu trabajo es declarar la verdad una vez y en un solo sitio; el framework se encarga de que los tipos nunca mientan sobre ella.
- Abre tu
tsconfig.jsony confirma qué configuración base extiende; súbela astrictsi estaba enbasey observa los avisos nuevos. - Crea un componente con una
interface Propsque exija untitulo; úsalo desde una página olvidando la prop y comprueba que el editor protesta. - Ejecuta
npx astro syncy localiza la carpeta.astro: inspecciona qué tipos ha generado y confírmala como ignorada en git. - Añade una integración con
npx astro add, revisa el diff propuesto y verifica qué cambió enastro.config.mjsy, si aplica, en tutsconfig.