Presentación

TypeScript es un lenguaje de programación construido sobre JavaScript que añade principalmente un sistema de tipos estáticos y herramientas de análisis destinadas a hacer que las grandes bases de código sean más predecibles y fáciles de mantener.

Un archivo TypeScript puede utilizar prácticamente toda la sintaxis habitual de JavaScript y añadir después anotaciones de tipos, interfaces, generics, unions, conditional types y muchas otras construcciones destinadas al compilador. Después de la verificación, esta información de tipos suele eliminarse y el código se transforma en JavaScript estándar destinado al navegador, Node.js u otro entorno compatible.

TypeScript no sustituye por tanto a JavaScript durante la ejecución. El navegador generalmente no ejecuta interfaces, aliases de tipos o generics de TypeScript: ejecuta el JavaScript producido después de la compilación o transformación.

El principal interés aparece antes de la ejecución. El compilador puede detectar que una propiedad no existe, que una función recibe un argumento incompatible, que un valor puede ser undefined o que un cambio de estructura provoca errores en otras partes del proyecto.

Esta información también alimenta los editores de código. Autocompletado, navegación hasta una definición, búsqueda de referencias, renombrado, documentación contextual y numerosos refactorings pueden utilizar el sistema de tipos para comprender mejor el programa.

TypeScript fue creado por Microsoft y publicado por primera vez en 2012. El proyecto es open source bajo licencia Apache 2.0 y su ecosistema va mucho más allá de las herramientas Microsoft: React, Angular, Vue, Svelte, Node.js, Deno, Bun y muchas bibliotecas JavaScript lo utilizan o proporcionan directamente sus tipos.

La generación actual también marca un importante cambio técnico. TypeScript 7 utiliza ahora un port nativo del compilador y de las herramientas escrito en Go, destinado a sustituir progresivamente la antigua implementación escrita en el propio TypeScript. Microsoft anuncia mejoras generalmente comprendidas entre aproximadamente 8x y 12x en builds completos, según el proyecto.

Durante esta verificación, la versión estable publicada más reciente es TypeScript 7.0.2, publicada el 20 de agosto de 2026.

Funcionalidades

Añadir tipos sin abandonar JavaScript

TypeScript suele describirse como un superset de JavaScript.

Por tanto, una gran cantidad de archivos JavaScript válidos pueden adoptarse progresivamente y enriquecerse con información de tipos.

Por ejemplo, una función puede indicar que dos parámetros esperan números y que devuelve un número. El compilador puede señalar después una llamada que le proporcione una cadena de caracteres.

Los tipos normalmente desaparecen cuando se genera JavaScript.

Esta característica distingue TypeScript de un lenguaje que dispone de su propio runtime: los tipos sirven principalmente para analizar el programa durante el desarrollo, no para modificar directamente el comportamiento de los valores durante la ejecución.

Inferencia de tipos

No es necesario anotar manualmente cada variable.

TypeScript utiliza ampliamente la inferencia de tipos para deducir información a partir del código.

Si una variable se inicializa con un número, el compilador puede determinar automáticamente que contiene un number. También puede inferir el tipo de retorno de muchas funciones o el parámetro genérico correspondiente a un argumento.

Esta inferencia permite mantener un código relativamente ligero mientras se conserva la verificación estática.

El objetivo no consiste por tanto en convertir cada línea en una declaración de tipo, sino en añadir anotaciones cuando el compilador no puede determinar correctamente la intención del desarrollador o cuando una API pública merece ser documentada explícitamente.

Tipos primitivos, arrays y objetos

TypeScript retoma los tipos correspondientes a los principales valores JavaScript:

  • string;
  • number;
  • boolean;
  • bigint;
  • symbol;
  • null;
  • undefined.

También añade sintaxis para describir con precisión arrays, tuples, objetos y funciones.

Un objeto puede, por ejemplo, describirse como poseedor de un nombre obligatorio, una edad opcional y un método específico.

Los tuples permiten representar una secuencia donde cada posición tiene un tipo conocido, a diferencia de un array homogéneo convencional.

TypeScript también puede conservar valores literales como tipos, por ejemplo "draft" | "published" en lugar de un simple string.

Interfaces y aliases de tipos

Las interfaces permiten describir la forma esperada de un objeto.

Se utilizan con frecuencia para definir las propiedades de un componente, la estructura de un usuario, la configuración de una función o un contrato compartido entre varias partes de una aplicación.

Los type aliases también permiten asignar un nombre a tipos, pero pueden representar construcciones más variadas: unions, intersections, primitives, tuples o combinaciones complejas.

Interfaces y aliases se solapan en varios usos pero no son completamente equivalentes.

Las interfaces disponen especialmente de un sistema de fusión de declaraciones que puede resultar útil en determinados escenarios de extensión de bibliotecas.

Tipado estructural

TypeScript utiliza principalmente un sistema de tipado estructural.

Esto significa que la compatibilidad depende sobre todo de la forma de un valor y no de su pertenencia explícita a una clase o jerarquía concreta.

Si una función espera un objeto que contenga name: string, cualquier objeto que posea al menos esa propiedad compatible puede ser aceptado generalmente, aunque nunca haya declarado explícitamente que implementa una interfaz concreta.

Esta filosofía encaja bastante bien con el funcionamiento flexible de JavaScript.

Se diferencia, sin embargo, de los sistemas nominales utilizados por algunos otros lenguajes, donde dos tipos con la misma estructura pueden seguir siendo incompatibles si no pertenecen explícitamente a la misma jerarquía.

Unions e intersections

Los union types permiten indicar que un valor puede pertenecer a varias categorías.

Un identificador puede, por ejemplo, definirse como string | number.

El código debe después tener en cuenta estas distintas posibilidades antes de utilizar una función específica de uno de los tipos.

Los intersection types, por el contrario, combinan varios tipos para construir un valor que respete simultáneamente varios contratos.

Estos mecanismos permiten modelar numerosos estados de aplicación sin tener que crear sistemáticamente nuevas clases.

Narrowing y análisis del flujo de control

TypeScript analiza las condiciones del programa para reducir progresivamente los tipos posibles.

Si una variable tiene el tipo string | undefined, una comprobación que confirme que no es undefined permite al compilador considerarla después como una cadena dentro de la rama correspondiente.

Este narrowing funciona con varios mecanismos JavaScript:

  • typeof;
  • instanceof;
  • comparaciones;
  • operador in;
  • comprobaciones de truthiness;
  • discriminants de objetos;
  • funciones de guarda de tipo.

Este análisis del flujo de control constituye una de las funciones más importantes de TypeScript, porque permite obtener un tipado preciso sin multiplicar las conversiones explícitas.

Generics

Los generics permiten crear componentes cuyos tipos siguen siendo parametrizables.

Una función puede, por ejemplo, aceptar un valor de tipo T y devolver el mismo tipo T sin perder la información precisa sobre ese valor.

A diferencia de any, un generic conserva la relación entre los distintos lugares donde aparece el tipo.

Los generics se utilizan en funciones, interfaces, clases, colecciones y bibliotecas.

Pueden asociarse a constraints, valores por defecto y relaciones entre varios parámetros de tipo.

Esta capacidad constituye una base importante de las API TypeScript avanzadas.

Conditional types, mapped types y keyof

El sistema de tipos de TypeScript permite construir nuevos tipos a partir de tipos existentes.

keyof, por ejemplo, produce la unión de las claves conocidas de un objeto.

Los mapped types permiten recorrer esas claves para transformar cada propiedad.

Los conditional types seleccionan un tipo en función de una condición relacionada con otro tipo.

Pueden combinarse con infer para extraer determinada información de un tipo complejo.

Estas funciones permiten crear bibliotecas extremadamente flexibles, pero también pueden producir definiciones difíciles de comprender cuando se utilizan en exceso.

Utility Types integrados

TypeScript proporciona varios utility types destinados a realizar transformaciones habituales.

Entre los más utilizados:

  • Partial<T>;
  • Required<T>;
  • Readonly<T>;
  • Pick<T, K>;
  • Omit<T, K>;
  • Record<K, T>;
  • Exclude<T, U>;
  • Extract<T, U>;
  • ReturnType<T>;
  • Parameters<T>;
  • Awaited<T>;
  • NonNullable<T>.

Permiten, por ejemplo, hacer opcionales todas las propiedades, seleccionar solo determinados campos o extraer el tipo devuelto por una función.

Estas utilidades evitan reescribir constantemente las mismas transformaciones.

unknown, any y never

TypeScript ofrece varios tipos especiales destinados a gestionar situaciones donde la información es incompleta o imposible.

any desactiva en gran medida la verificación de tipos para un valor y permite prácticamente cualquier operación. Puede facilitar determinadas migraciones, pero reduce considerablemente la protección proporcionada por TypeScript.

unknown también representa un valor desconocido, pero obliga al programa a comprobar su tipo antes de utilizarlo.

never describe un valor que no puede existir, como el retorno de una función que siempre lanza un error o determinadas ramas que se han vuelto imposibles después del narrowing.

Una base de código estricta suele preferir unknown cuando un valor es realmente desconocido en lugar de utilizar sistemáticamente any.

Clases y modificadores específicos de TypeScript

TypeScript retoma las clases JavaScript y añade controles adicionales.

Los parámetros y propiedades pueden recibir anotaciones de tipo.

El lenguaje también proporciona modificadores como:

  • public;
  • private;
  • protected;
  • readonly;
  • abstract.

Algunos de estos mecanismos no tienen exactamente el mismo papel que los campos privados JavaScript que utilizan #.

Los modificadores TypeScript se comprueban principalmente durante la compilación, mientras que los campos privados JavaScript poseen una verdadera semántica de encapsulación durante la ejecución.

Esta diferencia se vuelve importante cuando un desarrollador depende realmente de la privacidad de una propiedad en runtime.

Enums y otras construcciones específicas

TypeScript también dispone de algunas construcciones que no son simplemente anotaciones eliminadas.

Los enums pueden generar JavaScript adicional para crear un objeto utilizable durante la ejecución.

Los proyectos modernos utilizan a veces unions de valores literales u objetos as const en su lugar, especialmente para mantenerse más cerca de JavaScript estándar.

TypeScript también ofrece namespaces y varias funciones históricas, pero algunos enfoques antiguos son cada vez menos recomendados a medida que JavaScript incorpora más primitivas estandarizadas.

Compilación a JavaScript

El compilador TypeScript, tsc, analiza archivos .ts y .tsx, comprueba los tipos y después puede generar JavaScript.

La versión ECMAScript objetivo es configurable.

Un proyecto puede, por ejemplo, generar JavaScript relativamente moderno para un entorno reciente o transformar determinada sintaxis para dirigirse a un runtime más antiguo.

Es importante distinguir transformación sintáctica y polyfills.

TypeScript puede convertir determinada sintaxis reciente a una forma más antigua, pero no añade automáticamente todas las API ausentes de un navegador antiguo. Una función moderna inexistente en el entorno objetivo puede seguir necesitando un polyfill separado.

TypeScript 7 y nuevo compilador nativo

TypeScript 7 representa uno de los mayores cambios de arquitectura del proyecto.

La antigua implementación del compilador y del language service estaba históricamente escrita en el propio TypeScript y después se ejecutaba mediante JavaScript.

La nueva generación ha sido portada a Go.

Microsoft explica haber conservado en la medida de lo posible la estructura y lógica de la implementación anterior para mantener la compatibilidad de los resultados, beneficiándose al mismo tiempo de código nativo y paralelismo en memoria compartida.

En builds completos, el equipo TypeScript observa generalmente mejoras de aproximadamente 8 a 12 veces, según el tamaño y estructura del proyecto.

Esta mejora afecta especialmente a las grandes bases de código, donde los tiempos de compilación y análisis pueden representar una parte importante del workflow diario.

TypeScript 6 sigue estando disponible por separado para proyectos que todavía necesitan la generación anterior durante la transición.

tsconfig.json para configurar un proyecto

Un proyecto TypeScript suele definirse mediante un archivo tsconfig.json.

Este indica qué archivos pertenecen al proyecto y configura el comportamiento del compilador.

Entre las opciones importantes se encuentran especialmente:

  • target;
  • module;
  • moduleResolution;
  • lib;
  • strict;
  • jsx;
  • outDir;
  • rootDir;
  • declaration;
  • sourceMap;
  • allowJs;
  • checkJs.

Los monorepos o aplicaciones complejas pueden utilizar varios archivos tsconfig y project references para separar distintas partes del código.

Una configuración coherente con el runtime real es esencial: los ajustes adaptados a una aplicación Web empaquetada con Vite no son necesariamente los mismos que los de un paquete npm o un servidor Node.js.

Modo strict

La opción strict activa un conjunto de comprobaciones destinadas a hacer más exigente el sistema de tipos.

Incluye especialmente reglas relacionadas con valores nulos, parámetros de funciones o usos implícitos de any.

strictNullChecks es especialmente importante.

Cuando está activo, null y undefined dejan de considerarse automáticamente compatibles con la mayoría de los demás tipos.

Una propiedad potencialmente ausente debe por tanto tratarse explícitamente antes de utilizarse.

Este modo detecta más problemas, pero puede exigir más trabajo durante la migración de una base antigua de JavaScript o TypeScript poco estricta.

JavaScript existente con allowJs y checkJs

Adoptar TypeScript no obliga a convertir toda una base de código inmediatamente.

La opción allowJs permite incluir archivos .js dentro del proyecto.

checkJs solicita al compilador que también informe de determinados errores en esos archivos JavaScript.

Las anotaciones JSDoc pueden proporcionar información de tipos sin cambiar la extensión del archivo.

Este enfoque permite una migración progresiva: empezar analizando JavaScript existente, añadir anotaciones donde resulten útiles y después convertir determinados archivos a .ts poco a poco.

Archivos de declaración .d.ts

Los archivos .d.ts describen los tipos de un código JavaScript sin contener su implementación habitual.

Una biblioteca puede publicarlos para que los usuarios TypeScript conozcan sus funciones, clases, objetos y signatures.

Algunas bibliotecas incluyen directamente sus declaraciones dentro del package.

Para otras, la comunidad proporciona definiciones mediante DefinitelyTyped, generalmente instaladas como @types/nombre-del-package.

Este mecanismo permite a TypeScript comprender una enorme parte del ecosistema JavaScript incluso cuando la biblioteca original no está escrita en TypeScript.

JSX y archivos TSX

TypeScript admite JSX mediante archivos .tsx.

El compilador puede comprobar las propiedades proporcionadas a los componentes y transformar o conservar la sintaxis JSX según la configuración.

Existen varios modos, especialmente para React clásico, el runtime JSX automático o React Native.

TypeScript se ha vuelto así extremadamente habitual en proyectos React.

Otros frameworks también pueden utilizar JSX o sistemas de tipos relacionados con TypeScript según su propio toolchain.

Módulos, ESM y CommonJS

TypeScript comprende los distintos sistemas de módulos utilizados en el ecosistema JavaScript.

Los proyectos modernos utilizan cada vez más ECMAScript Modules — ESM, con import y export.

Node.js conserva, sin embargo, una historia importante alrededor de CommonJS.

Bundlers como Vite, webpack, Rollup o esbuild pueden aplicar también sus propias reglas de resolución y transformación.

TypeScript ofrece por tanto varias estrategias de module y moduleResolution.

Una mala configuración puede provocar diferencias entre lo que el compilador piensa que puede importarse y lo que el runtime sabe realmente cargar.

La documentación recomienda por tanto elegir estas opciones según el entorno de ejecución real en lugar de utilizar una configuración universal para todos los proyectos.

Integración IDE y Language Service

TypeScript no se limita al compilador de línea de comandos.

Su Language Service proporciona a los editores la información necesaria para comprender continuamente el proyecto.

Esto permite especialmente:

  • autocompletado;
  • visualización de tipos;
  • navegación a la definición;
  • búsqueda de referencias;
  • renombrado de símbolos;
  • refactorings;
  • diagnósticos en tiempo real;
  • documentación contextual.

Visual Studio Code dispone de una integración especialmente profunda, pero TypeScript también puede utilizarse en numerosos otros editores e IDE.

Estas funciones representan una parte esencial de su interés, incluso en proyectos JavaScript que todavía no utilizan plenamente el compilador TypeScript.

Casos de uso

Hacer más segura una aplicación JavaScript existente

Un equipo puede añadir TypeScript progresivamente a un proyecto JavaScript sin reescribirlo todo.

Puede empezar con allowJs y checkJs, introducir anotaciones JSDoc y después convertir los módulos más importantes a .ts.

Los errores relacionados con propiedades ausentes, parámetros incorrectos o valores potencialmente undefined aparecen entonces antes dentro del ciclo de desarrollo.

Esta migración progresiva reduce el riesgo frente a una reescritura completa.

Construir una gran aplicación front-end

Una aplicación React, Vue, Angular o Svelte suele contener numerosos componentes, estados, respuestas API y objetos compartidos.

TypeScript puede formalizar estos contratos.

Modificar la estructura de un objeto puede revelar inmediatamente varios lugares que han dejado de ser compatibles.

El autocompletado y los refactorings también se vuelven más fiables cuando el editor comprende con precisión las relaciones entre los componentes.

El interés suele aumentar con el tamaño del proyecto y el número de desarrolladores que participan en él.

Desarrollar una API Node.js

TypeScript puede utilizarse en servidor con Node.js y distintos frameworks.

Los tipos permiten describir parámetros, objetos de negocio, respuestas de base de datos e interfaces entre módulos.

También pueden compartirse con el front-end en determinados monorepos.

Esta coherencia no sustituye, sin embargo, la validación durante la ejecución: una petición HTTP externa puede contener cualquier dato, aunque el código TypeScript declare que una propiedad debería ser un número.

Por tanto, siguen siendo necesarias herramientas de validación en los límites del sistema.

Crear una biblioteca JavaScript con sus tipos

Un autor de biblioteca puede escribir su código en TypeScript y publicar tanto el JavaScript generado como las declaraciones .d.ts.

Los usuarios JavaScript siguen ejecutando el package normalmente.

Los usuarios TypeScript obtienen además autocompletado, documentación de parámetros y detección de errores.

Esta capacidad explica por qué una enorme cantidad de bibliotecas npm publican actualmente sus tipos directamente.

Refactorizar una gran base de código

En cientos o miles de archivos, renombrar una propiedad o modificar una signature puede resultar arriesgado con una simple búsqueda textual.

TypeScript construye una representación semántica del proyecto.

El editor puede entonces identificar las referencias reales a un símbolo en lugar de todas las cadenas de caracteres que simplemente se parecen.

El compilador puede después detectar las llamadas que no se hayan adaptado.

Esta capacidad para hacer evolucionar el código con mayor confianza constituye a menudo un beneficio más importante que las propias anotaciones.

Conclusión

TypeScript se ha convertido en una de las herramientas más importantes del ecosistema JavaScript porque interviene precisamente donde la flexibilidad del lenguaje original puede resultar difícil de gestionar: grandes aplicaciones, API complejas y bases de código que evolucionan durante varios años.

Su principio sigue siendo relativamente sencillo. El desarrollador escribe JavaScript enriquecido con información de tipos, el compilador analiza esa información y después genera JavaScript utilizable por los entornos de ejecución habituales.

La verdadera potencia procede, sin embargo, de su sistema de tipos. Inferencia, unions, narrowing, interfaces, generics, mapped types, conditional types y archivos de declaración permiten describir API extremadamente ricas sin añadir necesariamente lógica al runtime.

Este análisis también mejora considerablemente las herramientas de desarrollo. Navegación, refactoring y autocompletado se vuelven más fiables cuando el editor comprende las relaciones semánticas del programa.

TypeScript no elimina todos los problemas. Los tipos suelen borrarse durante la compilación y por tanto no validan automáticamente los datos recibidos desde una API, formulario o archivo externo. Un programa también puede utilizar any, assertions o configuraciones permisivas que evitan parte de la seguridad.

El sistema de tipos también puede volverse muy complejo cuando las bibliotecas construyen combinaciones profundas de generics, conditional types e inferencias avanzadas. En ese caso, la sofisticación destinada a ayudar al desarrollador puede convertirse ella misma en algo difícil de mantener.

TypeScript 7 introduce, sin embargo, un cambio especialmente importante en las herramientas. El paso del compilador a una implementación nativa en Go pretende reducir considerablemente los tiempos de compilación y análisis, con mejoras anunciadas del orden de 8x a 12x en numerosos builds completos.

Con TypeScript 7.0.2 como versión estable actual, el proyecto conserva por tanto su filosofía histórica mientras reconstruye su infraestructura para soportar mejor las grandes bases de código modernas.

Para un equipo que ya trabaja con JavaScript y busca más control, documentación implícita, refactoring fiable y detección temprana de errores sin abandonar el ecosistema Web, TypeScript sigue siendo actualmente una de las soluciones más naturales.

Puntos de atención

  • TypeScript está construido sobre JavaScript y generalmente genera JavaScript destinado al runtime final.

  • La versión estable actual verificada es TypeScript 7.0.2, publicada el 20 de agosto de 2026.

  • TypeScript 7 utiliza el nuevo compilador nativo escrito en Go, mientras que las generaciones anteriores dependían de una implementación TypeScript/JavaScript.

  • Microsoft anuncia builds completos generalmente entre 8 y 12 veces más rápidos con TypeScript 7, según el proyecto y el hardware.

  • TypeScript es gratuito y open source bajo licencia Apache 2.0.

  • Las anotaciones de tipos suelen eliminarse durante la compilación. No proporcionan validación automática de datos durante la ejecución.

  • Una respuesta API o entrada de usuario sigue necesitando validación en runtime cuando su origen no es fiable.

  • El tipado es principalmente estructural, lo que encaja bien con JavaScript pero se diferencia de los sistemas nominales utilizados por algunos otros lenguajes.

  • La opción strict está muy recomendada para nuevos proyectos, pero activarla en una base antigua puede revelar una gran cantidad de problemas que corregir.

  • any evita gran parte de la comprobación de tipos. unknown suele ser preferible cuando un valor es realmente desconocido.

  • TypeScript no proporciona automáticamente los polyfills necesarios para entornos antiguos. Compilar hacia un target antiguo no significa que todas las API modernas de JavaScript pasen a estar disponibles.

  • Los archivos .d.ts permiten tipar bibliotecas JavaScript sin modificar su código de ejecución.

  • DefinitelyTyped y los packages @types/* complementan las bibliotecas que no publican directamente sus propias declaraciones de tipos.

  • TypeScript admite JSX en archivos .tsx, lo que explica su fuerte adopción dentro del ecosistema React.

  • Los ajustes module y moduleResolution deben corresponder al runtime o bundler real. Una combinación incorrecta puede provocar problemas de importación pese a una compilación aparentemente correcta.

  • El sistema de tipos avanzado puede volverse muy complejo. Generics, mapped types y conditional types son potentes, pero no es necesario utilizarlos cuando tipos más simples son suficientes.

  • TypeScript no sustituye a JavaScript: comprender el comportamiento de JavaScript durante la ejecución sigue siendo indispensable.