TypeScript Fácil · Teoría

Comprende antes de memorizar

24 lecciones originales con ejemplos breves, puntos clave y referencias para profundizar.

01

TypeScript sobre JavaScript

TypeScript amplía la sintaxis de JavaScript con tipos estáticos y elimina esas anotaciones al emitir JavaScript. No cambia por sí solo las capacidades del runtime.

Ejemplo
const mensaje: string = "Hola desde TypeScript";
console.log(mensaje);

Puntos importantes

  • Todo JavaScript válido no es necesariamente TypeScript válido bajo strict.
  • Los tipos ayudan antes de ejecutar; no validan datos externos en runtime.
Practicar este concepto
02

tsc y comprobación de tipos

El compilador analiza sintaxis, opciones y relaciones de tipos antes de emitir. Un diagnóstico incluye un código estable como TS2322 y una explicación localizada.

Ejemplo
const edad: number = "veinte"; // TS2322

Puntos importantes

  • Un error de tipos debe bloquear el emit cuando noEmitOnError está activo.
  • El playground usa la Compiler API 5.9.3, no expresiones regulares.
03

Inferencia y anotaciones

TypeScript infiere tipos desde valores y contexto. Una anotación es útil cuando expresa un contrato que la inicialización no puede comunicar por sí sola.

Ejemplo
let puntos = 10;
const etiqueta: string = "nivel";

Puntos importantes

  • No anotes lo que el compilador ya deduce con claridad.
  • Anota fronteras públicas y valores inicialmente ambiguos.
Practicar este concepto
04

Tipos primitivos

string, number, boolean, bigint, symbol, null y undefined describen los primitivos de JavaScript. Los nombres String o Number representan wrappers y no son la opción habitual.

Ejemplo
const activo: boolean = true;
const total: number = 12.5;

Puntos importantes

  • number cubre enteros y decimales.
  • Usa los nombres primitivos en minúscula.
07

Tipos de objeto

Un tipo de objeto enumera propiedades y sus tipos. TypeScript compara la estructura disponible, no exige una clase nominal.

Ejemplo
const usuario: { nombre: string; activo: boolean } = { nombre: "Ada", activo: true };

Puntos importantes

  • Cada propiedad obligatoria debe estar presente.
  • La compatibilidad estructural permite valores con propiedades adicionales en muchos contextos.
Practicar este concepto
08

Funciones tipadas

Los parámetros y el retorno forman el contrato de una función. void expresa que el resultado no se utiliza, no que la función sea incapaz de devolver internamente.

Ejemplo
function sumar(a: number, b: number): number { return a + b; }

Puntos importantes

  • Anota parámetros para evitar any implícito.
  • La inferencia del retorno suele ser suficiente en funciones locales.
Practicar este concepto
09

Parámetros opcionales y predeterminados

Un parámetro con ? puede ser undefined; un valor predeterminado lo vuelve opcional para quien llama y aporta un valor dentro de la función.

Ejemplo
function saludar(nombre = "persona", titulo?: string) { return titulo ? `${titulo} ${nombre}` : nombre; }

Puntos importantes

  • Los opcionales van después de los obligatorios salvo firmas especiales.
  • Comprueba undefined antes de usar un parámetro opcional.
11

Tipos literales

Un literal como 'pendiente' es un tipo más preciso que string. Las uniones de literales modelan estados cerrados y evitan cadenas arbitrarias.

Ejemplo
type Estado = "pendiente" | "completado";
const estado: Estado = "pendiente";

Puntos importantes

  • const suele conservar literales mejor que let.
  • Los literales documentan valores admitidos.
12

Aliases de tipo

type asigna un nombre reutilizable a cualquier tipo, incluidas uniones, tuplas y primitivas. No crea un valor ni una validación de runtime.

Ejemplo
type Identificador = string | number;
const id: Identificador = "A-1";

Puntos importantes

  • Un alias mejora vocabulario, no crea nominalidad.
  • Puede combinarse mediante intersecciones y tipos genéricos.
14

Propiedades opcionales y readonly

? permite ausencia y readonly impide escribir mediante esa vista. Ninguno valida objetos recibidos en runtime ni congela estructuras anidadas.

Ejemplo
interface Configuracion { readonly id: string; tema?: "claro" | "oscuro"; }

Puntos importantes

  • Leer una propiedad opcional produce también undefined.
  • readonly no equivale a Object.freeze.
15

Null y strictNullChecks

Con strictNullChecks, null y undefined no pertenecen automáticamente a todos los tipos. Deben aparecer en el contrato y eliminarse mediante una comprobación.

Ejemplo
function mayusculas(texto: string | null) { return texto === null ? "" : texto.toUpperCase(); }

Puntos importantes

  • El operador ! silencia al compilador, pero no elimina null en runtime.
  • Modela la ausencia en el tipo cuando sea posible.
Practicar este concepto
17

Narrowing por igualdad y truthiness

Las comparaciones estrictas pueden relacionar uniones y eliminar null. Truthiness es útil, pero también descarta 0 y cadenas vacías, quizá válidos.

Ejemplo
function mostrar(valor: string | null) { if (valor !== null) console.log(valor); }

Puntos importantes

  • Prefiere === y !== para narrowing predecible.
  • No confundas ausencia con valores falsy válidos.
18

Narrowing con in e instanceof

in distingue objetos por propiedades y instanceof usa la cadena de prototipos de runtime. Ambos deben corresponder a diferencias reales observables.

Ejemplo
class ErrorDeRed { codigo = 500; }
function codigo(error: ErrorDeRed | { mensaje: string }) { return "codigo" in error ? error.codigo : 0; }

Puntos importantes

  • in considera propiedades opcionales en ambos lados posibles.
  • instanceof requiere un constructor disponible en runtime.
19

Type assertions

as T indica al compilador una interpretación compatible, pero no convierte ni comprueba el valor. Debe reservarse para información real que el análisis no conoce.

Ejemplo
const entrada: unknown = "texto";
const longitud = (entrada as string).length;

Puntos importantes

  • Una assertion incorrecta puede ocultar un fallo.
  • Narrowing y validación son preferibles a encadenar assertions.
21

Modificadores de acceso

public, protected y private de TypeScript controlan acceso estático. private se borra al emitir; #campo es privacidad nativa de JavaScript.

Ejemplo
class Cuenta { constructor(private saldo: number) {} consultar() { return this.saldo; } }

Puntos importantes

  • protected permite acceso desde subclases.
  • Usa # cuando necesites privacidad efectiva en runtime.
22

Módulos: import y export

Un archivo con import o export es un módulo con ámbito propio. TypeScript resuelve y comprueba sus dependencias según module y moduleResolution.

Ejemplo
export type Usuario = { nombre: string };
export const activo = true;

Puntos importantes

  • Los imports de tipos pueden eliminarse del emit.
  • El playground sólo resuelve archivos relativos declarados en su VFS.
Practicar este concepto
23

tsconfig.json

tsconfig define archivos del proyecto y opciones del compilador. target controla el JavaScript emitido; module y moduleResolution describen sistemas distintos que deben coordinarse.

Ejemplo
{ "compilerOptions": { "target": "ES2020", "module": "ESNext" } }

Puntos importantes

  • include y exclude seleccionan archivos; no cambian imports ya alcanzados.
  • Comprueba la referencia TSConfig para cada opción.
24

Modo strict

strict activa una familia de comprobaciones como strictNullChecks, noImplicitAny y strictFunctionTypes. Es una base de diseño, no un paso cosmético al final.

Ejemplo
function etiqueta(valor: unknown): string { return typeof valor === "string" ? valor : "desconocido"; }

Puntos importantes

  • Activa strict al iniciar proyectos nuevos.
  • Corregir los contratos es mejor que silenciar errores con any.