Tipos que expresan intención

TypeScript

Modela contratos, reduce estados inválidos y responde desde fundamentos hasta tipos avanzados usados en entrevistas.

8 temas claveJunior → SeniorVersión 1
Progreso0%
0 de 8 dominados
★★★★★Junior → Mid🔥 Fundamental

Inferencia, anotaciones y tipos primitivos

TypeScript infiere tipos a partir del valor y permite anotarlos cuando el contrato no es evidente. El objetivo no es escribir tipos por todas partes, sino conservar información útil.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

TypeScript infiere tipos a partir del valor y permite anotarlos cuando el contrato no es evidente. El objetivo no es escribir tipos por todas partes, sino conservar información útil.

Cómo funciona

La inferencia ocurre en compilación. Los tipos se eliminan al generar JavaScript, por lo que no validan datos externos en runtime.

Ejemplo

const port = 3000;
let status: "idle" | "loading" = "idle";

status = "loading";
console.log(typeof port, status);

Pregunta típica

¿TypeScript valida una respuesta HTTP en runtime?

Respuesta Senior

No. TypeScript comprueba el código durante desarrollo/compilación. Para datos externos necesito validación runtime con un schema, guards o una librería como Zod.

Repasar

Volver arriba ↑
★★★★★Junior → Senior🔥 Muy preguntado

Interfaces vs type aliases

Ambos describen formas. interface destaca para contratos extensibles y declaration merging; type representa también unions, primitivas, tuplas y transformaciones.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

Ambos describen formas. interface destaca para contratos extensibles y declaration merging; type representa también unions, primitivas, tuplas y transformaciones.

Cómo funciona

La diferencia práctica importa menos que la consistencia. Las interfaces son abiertas; los alias no se reabren, aunque pueden componerse con intersecciones.

Ejemplo

interface User { id: number }
interface User { name: string }

type Status = "active" | "blocked";
const user: User = { id: 1, name: "Erick" };
console.log(user.name);

Pregunta típica

¿Cuándo usarías interface y cuándo type?

Respuesta Senior

Usaría interface para contratos de objetos públicos que pueden extenderse, y type para unions, tuplas y transformaciones. En un equipo priorizaría una convención consistente.

Repasar

Volver arriba ↑
★★★★★Mid → Senior🔥 Obligatorio

Unions, discriminated unions y narrowing

Una unión representa alternativas. Un discriminante convierte estados complejos en un modelo exhaustivo y evita combinaciones imposibles.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

Una unión representa alternativas. Un discriminante convierte estados complejos en un modelo exhaustivo y evita combinaciones imposibles.

Cómo funciona

TypeScript estrecha el tipo con typeof, in, instanceof, comparaciones y type guards. Un switch exhaustivo puede apoyarse en never.

Ejemplo

type Result =
  | { status: "ok"; data: string }
  | { status: "error"; message: string };

function print(r: Result) {
  return r.status === "ok" ? r.data : r.message;
}
console.log(print({ status: "ok", data: "done" }));

Pregunta típica

¿Cómo evitarías estados inválidos en un formulario complejo?

Respuesta Senior

Modelaría estados con una discriminated union en lugar de varios booleanos independientes, y validaría exhaustividad con never.

Repasar

Volver arriba ↑
★★★★★Mid → Senior🔥 Muy preguntado

Generics y constraints

Un generic conserva la relación entre entradas y salidas sin perder precisión con any. Los constraints limitan qué operaciones son válidas.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

Un generic conserva la relación entre entradas y salidas sin perder precisión con any. Los constraints limitan qué operaciones son válidas.

Cómo funciona

El parámetro de tipo se resuelve al usar la función. keyof y extends permiten describir relaciones entre tipos.

Ejemplo

function get<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
const user = { id: 1, name: "Erick" };
console.log(get(user, "name"));

Pregunta típica

¿Por qué generic es mejor que any aquí?

Respuesta Senior

any elimina información y seguridad. Un generic conserva la relación entre el argumento y el resultado, permitiendo inferencia y errores tempranos.

Repasar

Volver arriba ↑
★★★★★Mid🔥 Uso diario

Utility types: Partial, Pick, Omit y Record

Los utility types transforman contratos existentes y evitan duplicar modelos. Deben reflejar semántica, no usarse para ocultar un diseño confuso.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

Los utility types transforman contratos existentes y evitan duplicar modelos. Deben reflejar semántica, no usarse para ocultar un diseño confuso.

Cómo funciona

Son mapped/conditional types incluidos globalmente. Partial vuelve opcionales propiedades; Pick/Omit seleccionan; Record crea un mapa de claves.

Ejemplo

interface User { id: number; name: string; role: string }
type UserPatch = Partial<Pick<User, "name" | "role">>;
const patch: UserPatch = { role: "admin" };
console.log(patch.role);

Pregunta típica

¿Usarías Partial<User> para cualquier endpoint PATCH?

Respuesta Senior

Solo si todas las propiedades son realmente actualizables. Normalmente prefiero Pick/Omit o un DTO explícito para no exponer campos sensibles.

Repasar

Volver arriba ↑
★★★★★Mid → Senior🔥 Clásico

any, unknown y never

any desactiva comprobaciones; unknown obliga a validar; never representa algo que no puede ocurrir o una función que no termina normalmente.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

any desactiva comprobaciones; unknown obliga a validar; never representa algo que no puede ocurrir o una función que no termina normalmente.

Cómo funciona

unknown es el tipo seguro para datos no confiables. never aparece al agotar todas las variantes de una unión.

Ejemplo

function format(value: unknown) {
  if (typeof value === "string") return value.toUpperCase();
  return "unsupported";
}
console.log(format("hello"));

Pregunta típica

¿Cuándo usarías unknown en lugar de any?

Respuesta Senior

En límites del sistema: JSON, catch, mensajes o APIs. unknown obliga a validar antes de operar; any propaga pérdida de seguridad.

Repasar

Volver arriba ↑
★★★★★Senior🔥 Senior frecuente

Mapped y conditional types con infer

Los mapped types recorren propiedades; los conditional types seleccionan un tipo según una relación. infer captura una parte de un tipo dentro de una condición.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

Los mapped types recorren propiedades; los conditional types seleccionan un tipo según una relación. infer captura una parte de un tipo dentro de una condición.

Cómo funciona

Son herramientas para crear APIs tipadas y utilidades reutilizables. Demasiada metaprogramación puede empeorar legibilidad y tiempos de compilación.

Ejemplo

type AsyncResult<T> = T extends Promise<infer R> ? R : T;
type Value = AsyncResult<Promise<string>>;
const value: Value = "ok";
console.log(value);

Pregunta típica

¿Qué trade-off tienen los tipos demasiado avanzados?

Respuesta Senior

Pueden mejorar la API pública, pero también producir errores difíciles de leer, ralentizar el compilador y aumentar la curva de aprendizaje. Los encapsularía y documentaría.

Repasar

Volver arriba ↑
★★★★★Mid → Senior🔥 Moderno

satisfies, as const y type assertions

satisfies valida compatibilidad sin reemplazar el tipo inferido. as const conserva literales y vuelve readonly de forma superficial. Una assertion no valida nada.

10–15 min
🟢 Base🟡 Entrevista🔴 Senior

Qué debes entender

satisfies valida compatibilidad sin reemplazar el tipo inferido. as const conserva literales y vuelve readonly de forma superficial. Una assertion no valida nada.

Cómo funciona

satisfies es útil en configuraciones: comprueba el contrato y mantiene claves/valores específicos para autocompletado.

Ejemplo

type Routes = Record<string, `/${string}`>;
const routes = { home: "/", profile: "/profile" } satisfies Routes;
console.log(routes.profile);

Pregunta típica

¿Qué diferencia hay entre satisfies y as?

Respuesta Senior

satisfies comprueba compatibilidad y preserva inferencia; as le dice al compilador que confíe en mí y puede ocultar errores.

Repasar

Volver arriba ↑