Menu
Coddy logo textTech

Hoja de Trucos de TypeScript

Última actualización

Tipos básicos

Los tipos primitivos y cómo anotar variables.

OperaciónSintaxis
Cadena (string)let name: string = "Ada";
Númerolet age: number = 25;
Booleanolet ok: boolean = true;
Array de Tlet xs: number[] = [1, 2, 3];
Array genéricolet xs: Array<string> = [];
Tuplalet pair: [string, number] = ["a", 1];
Any (sin tipado)let x: any = 1;
Unknown (any seguro)let x: unknown = JSON.parse(s);
Void (sin retorno)function log(): void { … }
Never (nunca retorna)function fail(): never { throw … }
Null / undefinedlet n: null = null;

Inferencia y anotaciones de tipos

Cuándo dejar que TS infiera y cuándo anotar.

OperaciónSintaxis
Inferido del valorlet count = 0; // number
Anotación explícitalet count: number = 0;
Parámetro de funciónfunction add(a: number, b: number) { … }
Tipo de retornofunction add(a: number, b: number): number { … }
Función flechaconst sq = (x: number): number => x * x;
Aserción de tipoconst el = input as HTMLInputElement;
Aserción const (literal)const dirs = ["up", "down"] as const;
Aserción de no-nuloel!.focus();

Interfaces

Describe la forma de un objeto.

OperaciónSintaxis
Declararinterface User { id: number; name: string; }
Propiedad opcionalinterface User { age?: number; }
Propiedad readonlyinterface User { readonly id: number; }
Firma de métodointerface Logger { log(msg: string): void; }
Extender otra interfazinterface Admin extends User { role: string; }
Firma de índiceinterface Map { [key: string]: number; }
Implementar en una claseclass Db implements Logger { … }

Alias de tipo y uniones

Nombra un tipo y combina tipos con | y &.

OperaciónSintaxis
Alias de tipotype ID = string | number;
Alias de objetotype User = { id: number; name: string };
Tipo unióntype Status = "idle" | "loading" | "done";
Tipo interseccióntype Admin = User & { role: string };
Tipo literaltype Yes = "yes";
Anulabletype Maybe<T> = T | null | undefined;
Alias de funcióntype Handler = (e: Event) => void;

Funciones

Parámetros tipados, retornos y sobrecargas.

OperaciónSintaxis
Parámetro opcionalfunction greet(name?: string) { … }
Parámetro por defectofunction greet(name = "friend") { … }
Parámetros restfunction sum(...ns: number[]): number { … }
Tipo de funciónlet fn: (a: number) => number;
Interfaz invocableinterface Fn { (x: number): number; }
Firmas de sobrecargafunction f(x: string): string; function f(x: number): number; function f(x: any) { return x; }
Retorno void ignoradoconst cb: () => void = () => 42; // ok

Clases

Clases con modificadores de acceso y propiedades de parámetro.

OperaciónSintaxis
Declarar una claseclass User { name: string; }
Constructorconstructor(name: string) { this.name = name; }
Propiedad de parámetroconstructor(public name: string) {}
Public / private / protectedprivate id: number;
Campo readonlyreadonly id: number;
Miembro estáticostatic count = 0;
Getter / setterget name() { return this._name; }
Herenciaclass Admin extends User { … }
Clase abstractaabstract class Shape { abstract area(): number; }

Genéricos

Tipos reutilizables parametrizados por otros tipos.

OperaciónSintaxis
Función genéricafunction id<T>(x: T): T { return x; }
Llamar con tipo explícitoid<string>("hi");
Interfaz genéricainterface Box<T> { value: T; }
Alias genéricotype Pair<A, B> = [A, B];
Clase genéricaclass Stack<T> { items: T[] = []; }
Restricción con extendsfunction len<T extends { length: number }>(x: T) { return x.length; }
Parámetro de tipo por defectointerface Box<T = string> { value: T; }
Operador keyoftype K = keyof User; // "id" | "name"
Acceso por índicetype Name = User["name"];

Narrowing

Reduce una unión a un solo tipo en tiempo de ejecución.

OperaciónSintaxis
Comprobación con typeofif (typeof x === "string") { … }
Comprobación con instanceofif (e instanceof Error) { … }
Operador inif ("name" in obj) { … }
Narrowing por igualdadif (status === "done") { … }
Por veracidadif (value) { … }
Type guard personalizadofunction isUser(x: any): x is User { return "id" in x; }
Unión discriminadatype Shape = { kind: "sq"; size: number } | { kind: "ci"; r: number };
Exhaustividad con neverconst _: never = shape;

Enums

Conjuntos de constantes con nombre.

OperaciónSintaxis
Enum numéricoenum Direction { Up, Down, Left, Right }
Enum de cadenasenum Status { Idle = "IDLE", Done = "DONE" }
Usar un valorlet d: Direction = Direction.Up;
Const enum (inlineado)const enum Color { Red, Green, Blue }
Unión de literales (moderno)type Status = "idle" | "done";

Utility types

Helpers integrados que transforman tipos existentes.

OperaciónSintaxis
Todas las props opcionalesPartial<User>
Todas las props requeridasRequired<User>
Todas las props readonlyReadonly<User>
Seleccionar un subconjunto de clavesPick<User, "id" | "name">
Omitir una o más clavesOmit<User, "password">
Objeto con claves dadasRecord<string, number>
Excluir de una uniónExclude<"a" | "b" | "c", "a">
Mantener solo de una uniónExtract<"a" | "b", "a" | "c">
Quitar null / undefinedNonNullable<string | null>
Tipo de retorno de funciónReturnType<typeof fn>
Tupla de parámetrosParameters<typeof fn>
Tipo de promesa resueltaAwaited<Promise<string>>

Módulos

Importar y exportar entre archivos.

OperaciónSintaxis
Export con nombreexport function add(a: number, b: number) { … }
Export por defectoexport default class User { … }
Re-exportarexport { User } from "./user";
Import con nombreimport { add } from "./math";
Import por defectoimport User from "./user";
Import solo tipoimport type { User } from "./user";
Importar todoimport * as math from "./math";
Referencia triple-slash/// <reference types="node" />

tsconfig esenciales

Los flags del compilador que vale la pena conocer.

OpciónEfecto
"strict": trueHabilita todas las comprobaciones del modo estricto (recomendado).
"target": "ES2022"Versión de JavaScript que emite tsc.
"module": "ESNext"Sistema de módulos en la salida.
"moduleResolution": "bundler"Resuelve módulos como lo hacen los bundlers modernos.
"jsx": "react-jsx"Habilita JSX para React 17+.
"esModuleInterop": trueImports por defecto más limpios desde CommonJS.
"skipLibCheck": trueOmite el chequeo de tipos en node_modules (más rápido).
"noEmit": trueSolo verificación de tipos: el bundler emite la salida.

La sintaxis de TypeScript que más usas, en una sola página. Esta hoja de trucos de TypeScript es una referencia rápida para el día a día con TS: tipos básicos, interfaces, alias de tipo, genéricos, uniones, narrowing y los utility types integrados.

Todo lo que hay aquí es TypeScript estándar que compila con tsc y se ejecuta en cualquier lugar donde corra JavaScript moderno. Copia lo que necesites o prueba cualquier fragmento en vivo en el playground de TypeScript, sin instalar nada.

Preguntas frecuentes sobre la hoja de trucos de TypeScript

¿Esta hoja de trucos de TypeScript es gratis?
Sí. Esta hoja de trucos de TypeScript es completamente gratis, sin necesidad de registrarse. Guárdala en favoritos y vuelve cuando necesites consultar un tipo, una interfaz o un utility type.
¿Cuál es la diferencia entre una interfaz y un alias de tipo?
Ambos pueden describir la forma de un objeto y, en la mayoría de los casos cotidianos, son intercambiables. Las interfaces se pueden reabrir y extender entre archivos (declaration merging), lo cual es útil para tipos de librerías. Los alias de tipo pueden nombrar uniones, intersecciones, tuplas y mapped types: formas que no se pueden expresar con interface. Una regla común: usa interface para formas de objeto públicas y type para uniones, tuplas y tipos calculados.
¿Cuál es la diferencia entre any y unknown?
any desactiva totalmente el chequeo de tipos: el compilador te dejará hacer cualquier cosa con él. unknown es seguro: debes acotarlo (con typeof, instanceof o un type guard) antes de poder usarlo. Prefiere unknown para valores de fuentes externas como JSON.parse o fetch: te obliga a validar antes de usar.
¿Necesito aprender JavaScript antes que TypeScript?
Sí: TypeScript es JavaScript con un sistema de tipos encima, así que todo lo que sabes de JS te sirve. Si aún estás afianzando los fundamentos (arrays, objetos, async/await), la hoja de trucos de JavaScript es un buen punto de partida y el curso gratis de JavaScript de Coddy cubre lo mismo de forma interactiva.
¿Puedo practicar TypeScript online?
Sí. Abre el playground de TypeScript para ejecutar cualquier fragmento de esta hoja de trucos en tu navegador, sin instalar nada. Cuando quieras estructura, aprende desde el landing de JavaScript y aplica los tipos de esta página encima.
Coddy programming languages illustration

Aprende TypeScript con Coddy

COMENZAR