Documentación de TypeScript
Referencia concisa y basada en ejemplos de TypeScript. Lee el concepto, mira el código y practícalo en un recorrido de Coddy.
Inicia un recorrido guiado de TypeScriptPrimeros pasos
- Qué es TypeScript¿Qué es TypeScript? Es JavaScript con tipos estáticos. Anotas los valores con tipos, el compilador los comprueba antes de ejecutar el código y el resultado es JavaScript normal que funciona en cualquier navegador, en Node.js, Deno y Bun. Este tutorial de TypeScript lo explica con ejemplos ejecutables.
- TypeScript vs JavaScriptTypeScript es JavaScript más un sistema de tipos estático que se comprueba antes de ejecutar el código. Compara los dos lado a lado: sintaxis, qué detecta el comprobador de tipos, el paso de build, la velocidad, la curva de aprendizaje y cómo migrar un proyecto JavaScript.
- Instalar TypeScriptInstala TypeScript con npm como dependencia de desarrollo del proyecto, comprueba la versión con npx tsc --version, crea un tsconfig.json con tsc --init y compila tu primer archivo. Incluye la instalación global, pnpm, Yarn y Bun, y los errores más habituales.
- Ejecutar TypeScriptCinco formas de ejecutar un archivo .ts: compilar con tsc y ejecutar el JavaScript, ejecutarlo directamente con node file.ts (type stripping), usar tsx o ts-node, o usar Deno y Bun. Cuáles comprueban tipos, qué sintaxis admite cada una y cuál elegir.
- tsconfig.jsontsconfig.json marca una carpeta como proyecto TypeScript y fija las opciones del compilador. Las opciones que importan (target, module, moduleResolution, strict, rootDir, outDir, include, lib, types, noEmit, skipLibCheck), una configuración inicial recomendada, extends y qué cambió TypeScript 7.
- TypeScript 7TypeScript 7 es el compilador de TypeScript reescrito en Go como programa nativo: unas diez veces más rápido, con el mismo comando tsc y el mismo lenguaje. Qué cambia para los usuarios (nuevos valores por defecto, opciones eliminadas, la API JavaScript que falta), qué herramientas aún necesitan TypeScript 6 y cómo actualizar.
- ComentariosTypeScript usa los comentarios // y /* */ de JavaScript, además de los comentarios JSDoc /** */ que los editores muestran al pasar el ratón. También lee algunos comentarios especiales: @ts-expect-error, @ts-ignore, @ts-nocheck, @ts-check y las directivas /// <reference>.
- TypeScript vs PythonTypeScript y Python son lenguajes de alto nivel con recolección de basura, pero TypeScript comprueba sus tipos antes de ejecutar el código y las anotaciones de tipo de Python son opcionales y se ignoran en tiempo de ejecución. Comparativa de tipado, entorno de ejecución, velocidad, ecosistemas y usos, con el mismo programa en los dos.
Tipos básicos
- Tipos básicosLos tipos integrados de TypeScript: string, number, boolean, bigint, symbol, null y undefined, más un vistazo a arrays y objetos. Cómo escribir una anotación de tipo, por qué no existe un tipo entero y por qué se escribe string y no String.
- Inferencia de tiposTypeScript deduce la mayoría de los tipos a partir de los valores que escribes. Aprende qué infiere para variables, let frente a const, objetos, arrays y valores de retorno, cómo los callbacks reciben sus tipos del contexto y dónde sigues necesitando una anotación.
- StringsCómo trabajar con strings en TypeScript: interpolación con template literals, strings multilínea, comprobar si un string contiene un substring, los métodos habituales y los tipos que devuelven, y los tipos literales de string.
- String a númeroConvierte un string a número en TypeScript con Number(), parseInt(), parseFloat() o el + unario, mira cómo trata cada uno entradas como "42px", "" y "1e3", comprueba NaN de forma segura y convierte números de vuelta a strings.
- ArraysCómo tipar arrays en TypeScript: T[] frente a Array<T>, arrays de objetos, arrays con varios tipos, arrays readonly y qué devuelven map, filter, reduce y find. Además, la trampa de includes con arrays de literales.
- TuplasUna tupla en TypeScript es un array con un número fijo de elementos cuyos tipos se conocen por posición, como [string, number]. Aprende la sintaxis, los elementos con nombre, opcionales y rest, las tuplas readonly y as const, cómo devolver tuplas desde funciones y en qué se diferencian de los arrays.
- Tipos objetoCómo tipar objetos en TypeScript: tipos objeto en línea, propiedades opcionales con ?, propiedades readonly, objetos anidados, métodos, la comprobación de propiedades de más y la diferencia entre object, {} y Object.
- EnumsUn enum en TypeScript es un conjunto de constantes con nombre, como enum Direction { Up, Down }. Aprende los enums numéricos y de string, el JavaScript al que compila un enum, el mapeo inverso, cómo recorrer un enum, los const enum y cuándo es mejor una unión de literales de string o un objeto as const.
Tipos especiales
- Tipos literalesUn tipo literal es un tipo con exactamente un valor, como "GET" o 404. Aprende los tipos literales de string, number y boolean, las uniones de literales, por qué let ensancha y const no, qué hace as const y los parámetros de tipo const.
- any vs unknownany y unknown aceptan cualquier valor. any desactiva la comprobación de tipos para ese valor, mientras que unknown te obliga a comprobarlo antes de usarlo. Aprende las diferencias, cómo estrechar unknown, noImplicitAny y por dónde se cuela any en el código tipado.
- Tipo nevernever es el tipo sin valores. Es el tipo de retorno de las funciones que nunca terminan, el tipo que queda cuando el estrechamiento ha descartado todos los casos y la herramienta detrás de las comprobaciones exhaustivas de un switch. Aprende de dónde viene y en qué se diferencia de void.
- null y undefinedCon strictNullChecks, null y undefined son tipos separados que TypeScript te obliga a manejar. Aprende a comprobarlos, el encadenamiento opcional (?.), el doble signo de interrogación (??) y ??=, y la diferencia entre una propiedad opcional y | undefined.
- Aserción non-null (!)Un signo de exclamación después de un valor, como user!, es el operador de aserción non-null: quita null y undefined del tipo sin ninguna comprobación en tiempo de ejecución. Aprende qué hace x!, las formas de asignación definitiva let x!: T y prop!: T, por qué son arriesgadas y qué alternativas son más seguras.
Interfaces y alias de tipo
- InterfacesUna interfaz pone nombre a la forma de un objeto: qué propiedades tiene y de qué tipo es cada una. Aprende a declararla, las propiedades opcionales y readonly, los métodos, las firmas de índice, extenderla, implementarla en una clase, la fusión de declaraciones, las interfaces genéricas y cómo dar valores por defecto a una interfaz.
- Alias de tipoUn alias de tipo da nombre a cualquier tipo con la palabra clave type: formas de objeto, uniones, tuplas, funciones, genéricos y tipos recursivos. Aprende la sintaxis, cómo es cada forma y por qué un alias es solo un nombre y no un tipo nuevo e independiente.
- Interface vs typeinterface y type pueden describir formas de objeto, y la mayoría de las veces sirve cualquiera. Aprende las diferencias reales: fusión de declaraciones, uniones y mapped types, extends frente a intersecciones, firmas de índice implícitas, mensajes de error y rendimiento del compilador, más una regla clara para elegir.
- Palabra clave extendsLa palabra clave extends construye un tipo a partir de otro. Aprende a extender una interfaz (una o varias), extender un alias de tipo con &, sobrescribir el tipo de una propiedad, sustituir propiedades con Omit, y qué significa extends en clases, restricciones genéricas y conditional types.
- Tipos uniónUn tipo unión como string | number significa que un valor puede ser uno de varios tipos. Aprende qué puedes hacer con una unión (solo lo que admiten todos sus miembros), cómo estrecharla, las uniones de literales y de tipos objeto, y la diferencia entre (A | B)[] y A[] | B[].
- Tipos intersecciónUn tipo intersección A & B describe un valor que es A y B a la vez, así que tiene todos los miembros de los dos. Aprende a combinar tipos objeto con &, por qué las propiedades en conflicto se vuelven never, cómo las intersecciones de uniones solo conservan los miembros compartidos y cuándo usar extends.
- Uniones discriminadasUna unión discriminada es una unión de tipos objeto que comparten una propiedad etiqueta literal, como kind o status. Comprobar la etiqueta estrecha el objeto entero. Aprende el patrón, el estrechamiento con switch, las comprobaciones exhaustivas con never y cómo modelar resultados de APIs, el estado de una petición y máquinas de estados.
Funciones
- FuncionesCómo tipar funciones en TypeScript: anota cada parámetro, anota o deja inferir el tipo de retorno, usa void para funciones que no devuelven nada y tipa funciones flecha, expresiones de función, funciones async y el parámetro this.
- Tipos de funciónCómo escribir el tipo de una función en TypeScript: la sintaxis flecha (a: number) => string, alias de tipo para funciones, tipar funciones flecha y callbacks, firmas de llamada y de construcción, y por qué el tipo Function es demasiado laxo.
- Parámetros opcionalesMarca un parámetro de TypeScript como opcional con ?, dale un valor por defecto o recoge cualquier número de argumentos con un parámetro rest. Incluye las reglas de orden, omitido frente a undefined, objetos de opciones y parámetros opcionales en tipos de función.
- Sobrecarga de funcionesLas sobrecargas de funciones de TypeScript permiten que una función tenga varias firmas de llamada, cada una con su propio tipo de retorno. Aprende el patrón de firmas de sobrecarga más implementación, las reglas que comprueba el compilador, cuándo es mejor un parámetro unión y las sobrecargas en clases.
Estrechamiento y comprobación de tipos
- Estrechamiento de tiposEl estrechamiento (narrowing) es cómo TypeScript convierte un tipo amplio como string | number en uno concreto dentro de un if, un switch o tras un return temprano. Todas las formas de estrechar en un solo sitio: typeof, veracidad, igualdad, in, instanceof, asignaciones, predicados de tipo y uniones discriminadas.
- Operador typeoftypeof tiene dos trabajos en TypeScript. En el código es el operador de JavaScript que devuelve "string", "number", "object" y demás en tiempo de ejecución, y TypeScript estrecha con él. En un tipo es la consulta de tipo que copia el tipo de una variable, como en keyof typeof obj y ReturnType<typeof fn>.
- Operador instanceofinstanceof comprueba en tiempo de ejecución si un objeto lo creó una clase, y TypeScript estrecha la variable a esa clase. Cómo funciona con tus propias clases y con subclases de Error, por qué no puede comprobar interfaces ni alias de tipo y dónde da respuestas sorprendentes.
- Type guardsUn type guard es una comprobación en tiempo de ejecución que TypeScript entiende. Aprende los guards integrados, cómo escribir los tuyos con un predicado value is Type, cómo comprobar si un objeto es de un tipo, las funciones de aserción con asserts y cómo validar datos unknown.
- Aserciones de tipoLa palabra clave as le dice a TypeScript que trate un valor como si fuera de otro tipo. No es un cast: en tiempo de ejecución no se convierte ni se comprueba nada. Aprende la sintaxis as y la de corchetes angulares, qué permite el compilador, las aserciones dobles a través de unknown y cuándo es mejor un type guard.
- Operador satisfiesEl operador satisfies comprueba que un valor encaja con un tipo sin cambiar el tipo inferido del valor. Aprende qué hace, cómo se compara con una anotación de tipo y con as (el mismo objeto escrito de tres formas), cómo se combina con as const y por qué encaja con los objetos de configuración.
Clases
- ClasesLas clases de TypeScript son clases de JavaScript con campos, métodos y constructores tipados. Aprende cómo funcionan las declaraciones de campos y strictPropertyInitialization, cómo tipar this, getters y setters, miembros estáticos, implements y cómo una clase sirve también de tipo.
- ConstructoresCómo tipar el constructor de una clase en TypeScript: parámetros tipados y opcionales, parameter properties como constructor(private name: string), orden de inicialización de los campos, sobrecargas del constructor, llamadas a super en subclases, constructores privados y tipos de constructor con new.
- Modificadores de accesoTypeScript tiene tres modificadores de acceso, public, private y protected, además de readonly. Aprende qué permite cada uno, por qué private de TypeScript es una comprobación en tiempo de compilación mientras que los campos #private de JavaScript se aplican en tiempo de ejecución, y cuál elegir.
- HerenciaHerencia de clases en TypeScript: extends y super, sobrescribir métodos con tipos compatibles, la palabra clave override y noImplicitOverride, miembros protected, volver a declarar campos con declare y cuándo implements es la mejor herramienta.
- Clases abstractasUna clase abstracta en TypeScript es una clase base que no se puede instanciar y que puede dejar métodos para que los implementen las subclases. Aprende los métodos y propiedades abstractos, el patrón template method, los tipos de constructor abstractos y cuándo es mejor una interfaz.
- DecoradoresLos decoradores son funciones que envuelven o sustituyen miembros de una clase con la sintaxis @. Aprende los decoradores estándar que TypeScript admite sin ninguna opción (de clase, método, getter, campo y accessor), las fábricas de decoradores, addInitializer y en qué se diferencian de los experimentalDecorators antiguos que usan Angular y NestJS.
Genéricos
- GenéricosLos genéricos permiten que una función, interfaz, tipo o clase funcione con muchos tipos manteniéndolos conectados: lo que entra decide lo que sale. Aprende las funciones genéricas, la inferencia de argumentos de tipo, varios parámetros de tipo, interfaces y clases genéricas, valores por defecto y cuándo no usar genéricos.
- Restricciones genéricasUna restricción genérica, T extends Something, limita qué tipos acepta un parámetro de tipo y permite que la función use lo que la restricción garantiza. Incluye extends con formas de objeto e interfaces, K extends keyof T para acceder a propiedades con seguridad, restricciones sobre primitivos y los errores que te vas a encontrar.
Operadores de tipo
- Operador keyofkeyof toma un tipo objeto y te da la unión de los nombres de sus propiedades. Aprende keyof con interfaces, keyof typeof para objetos normales, el acceso tipado a propiedades con genéricos, las index signatures (string | number) y por qué Object.keys devuelve string[].
- Indexed access typesUn indexed access type lee el tipo de una propiedad de otro tipo: Person["age"] es number. Aprende T["key"], claves en unión, T[keyof T], T[number] para los elementos de un array, los índices de tuplas y (typeof arr)[number] para convertir un array const en una unión.
- Mapped typesUn mapped type construye un tipo objeto nuevo recorriendo claves: { [K in keyof T]: ... }. Aprende la sintaxis, los modificadores readonly y ? con + y -, el remapeo de claves con as, cómo filtrar claves y cómo están escritos Partial, Readonly, Required, Pick y Record.
- Conditional typesUn conditional type elige uno de dos tipos según una comprobación: T extends U ? X : Y. Aprende la sintaxis, cómo se distribuyen sobre las uniones (y cómo evitarlo), cómo extraer tipos con infer y cómo escribir tu propio ReturnType.
- Template literal typesLos template literal types construyen tipos literales de string con la misma sintaxis de comillas invertidas que los template strings de JavaScript: `on${Capitalize<E>}`. Aprende la sintaxis, cómo se multiplican las uniones, Uppercase y Capitalize, patrones como `${number}px`, getters con mapped types y cómo analizar strings con infer.
- Branded typesUn branded type es un primitivo con una etiqueta invisible, como string & { readonly __brand: "UserId" }, para que un UserId no se pueda pasar donde se espera un OrderId. Aprende cómo funcionan las marcas, las funciones constructoras que validan, un helper genérico Brand, las marcas con unique symbol y los números con marca.
Tipos de utilidad
- Utility typesTodos los utility types integrados de TypeScript en un solo sitio: Partial, Required, Readonly, Pick, Omit, Record, Exclude, Extract, NonNullable, Parameters, ReturnType, Awaited, los tipos de strings y más, cada uno con una descripción de una línea y un ejemplo ejecutable.
- RecordRecord<K, V> es el tipo objeto cuyas claves son K y cuyos valores son todos V. Aprende Record con claves string y con claves en unión (todas obligatorias), Partial<Record>, cómo recorrer un Record con claves tipadas, el problema de la clave que falta y cuándo usar una index signature o un Map.
- Partial y RequiredPartial<T> hace opcionales todas las propiedades de T, que es justo el tipo de un objeto de actualización o patch. Aprende Partial en funciones de actualización, por qué es superficial, cómo escribir un DeepPartial, el problema del undefined explícito y su opuesto, Required<T>.
- OmitOmit<T, K> crea un tipo con todas las propiedades de T salvo las claves K. Aprende Omit con una y con varias claves, cómo sobrescribir el tipo de una propiedad, cómo quitar la propiedad en ejecución, Omit frente a Exclude y Pick, por qué Omit acepta claves que no existen, un Omit estricto y Omit sobre tipos unión.
- PickPick<T, K> crea un tipo solo con las propiedades de T cuyas claves están en K. Aprende Pick con una o varias claves, cómo comprueba las claves, Pick frente a Omit, cómo seleccionar de tipos anidados, una función pick() tipada y cómo seleccionar propiedades por el tipo de su valor.
- readonly y ReadonlyEl modificador readonly y el utility type Readonly<T> impiden que el código reasigne propiedades. Aprende las propiedades readonly y los campos de clase, Readonly<T>, los arrays readonly (readonly T[] y ReadonlyArray), ReadonlyMap y ReadonlySet, por qué readonly es superficial y solo de compilación, y cómo se compara con Object.freeze y as const.
- Exclude y ExtractExclude, Extract y NonNullable filtran los miembros de un tipo unión. Aprende qué conserva y qué quita cada uno, cómo elegir miembros de una unión por su forma, cómo se construyen a partir de conditional types y en qué se diferencian de Omit y Pick.
- ReturnType y ParametersReturnType, Parameters, ConstructorParameters, InstanceType y Awaited extraen tipos de funciones, clases y promesas. Aprende a usarlos con typeof, cómo obtener el tipo del resultado de una función async, qué pasa con las sobrecargas y los genéricos, y cómo se construye ReturnType con infer.
Bucles y colecciones
- BuclesTodas las formas de recorrer datos en TypeScript y los tipos que da cada una: el bucle for clásico, for...of sobre arrays, maps y strings, for...in y sus claves string, forEach (sin break ni await), bucles tipados sobre las claves de un objeto y while.
- Sentencia switchLa sentencia switch en TypeScript: sintaxis, cómo cada case estrecha un tipo unión, switch exhaustivos que no compilan cuando falta un case, el patrón switch (true), el fallthrough y el ámbito de bloque.
- MapCómo usar Map en TypeScript: crear un Map<K, V> tipado, por qué get devuelve V | undefined, set, has y delete, recorrerlo en orden de inserción, claves que son objetos, convertir a y desde objetos y JSON, Map frente a objeto y Record, y cómo tipar array.map().
- DiccionariosTypeScript no tiene una clase dictionary ni hashmap; una búsqueda clave valor se tipa con una firma de índice, Record<K, V> o Map<K, V>. Aprende cada una, cómo comprobar si existe una clave, añadir, borrar y recorrer, y por qué noUncheckedIndexedAccess importa en los diccionarios.
Asincronía y errores
- PromesasCómo se tipan las promesas en TypeScript: el tipo Promise<T>, tipar new Promise y resolve, cómo cambia el tipo con then, por qué catch te da any, Promise.all con resultados en tupla, los tipos de resultado de Promise.allSettled y envolver APIs de callbacks en una promesa tipada.
- Async/AwaitCómo se tipan async y await en TypeScript: una función async devuelve Promise<T>, await la desenvuelve, los errores se capturan con try/catch, el await de nivel superior necesita un ES module, y la diferencia entre esperar una por una, esperar en paralelo y la trampa de forEach.
- Manejo de erroresManejo de errores en TypeScript: por qué la variable de catch es unknown, cómo estrecharla con instanceof Error, lanzar errores, escribir clases de error propias con name y cause, y el patrón del tipo Result para los errores que esperas.
- SleepTypeScript no tiene un sleep integrado, pero una línea te da uno: una función que devuelve una Promise<void> resuelta por setTimeout. Aprende a esperarla con await, pausar dentro de bucles, reintentar con un retardo, cancelar un sleep y por qué JavaScript no tiene un sleep bloqueante.
Módulos y herramientas
- MódulosTodo archivo de TypeScript con un import o export de nivel superior es un módulo. Aprende los exports con nombre y por defecto, import type y export type, cómo la opción module decide entre salida ES module y CommonJS, y por qué node16 y nodenext piden la extensión .js en los imports.
- NamespacesUn namespace de TypeScript agrupa valores y tipos bajo un mismo nombre y compila a un objeto normal. Aprende la sintaxis, cómo se fusionan los namespaces entre sí y con funciones y clases, por qué los ES modules los sustituyeron y dónde siguen apareciendo: archivos de declaraciones y ampliación del ámbito global.
- Archivos de declaraciónUn archivo .d.ts describe los tipos de código JavaScript sin contener nada de ese código, y la palabra clave declare hace lo mismo dentro de un archivo .ts. Aprende cómo se generan los archivos de declaración, qué papel tienen los paquetes @types, cómo tipar un módulo sin tipos y cómo declare global y la ampliación de módulos extienden tipos existentes.
- Modo strictstrict: true en tsconfig.json activa una familia de comprobaciones de tipos: noImplicitAny, strictNullChecks, strictPropertyInitialization y cinco más. Mira qué detecta cada una, cómo activar el modo strict en un proyecto existente y las opciones útiles que strict no incluye.
- JSONJSON.parse devuelve any, así que TypeScript se fía de cualquier tipo que le des al resultado. Aprende a tipar JSON parseado, validarlo con un type guard, convertir una muestra de JSON en una interfaz, importar archivos .json y qué hace JSON.stringify con Dates, Sets y undefined.
Para ir más lejos
- Buenas prácticasOcho hábitos de TypeScript que evitan bugs reales: mantener strict activado, usar unknown en lugar de any, dejar trabajar a la inferencia, preferir uniones a enums, comprobar la configuración con satisfies, modelar el estado con uniones discriminadas, evitar ! y as, y hacer los datos readonly. Cada uno con un antes y un después ejecutables.
- Preguntas de entrevista25 preguntas de entrevista de TypeScript con respuestas cortas, correctas y con código, ordenadas de principiante a avanzado: any frente a unknown, interface frente a type, genéricos, estrechamiento, utility types, mapped y conditional types, tipado estructural, tsconfig y TypeScript 7.