TypeScript se convirtió en el lenguaje con más contribuidores activos de GitHub en agosto de 2025, con 2.6 millones de devs colaborando mensualmente. Hoy en día no es una ventaja competitiva tenerlo en el CV, es un requisito en la mayoría de empresas de producto tecnológico.
Si tienes una entrevista técnica próximamente, esta guía cubre las preguntas que realmente hacen los equipos de contratación, desde las más básicas hasta las que distinguen a un candidato senior de uno junior. Cada respuesta incluye el contexto que los entrevistadores esperan escuchar, no solo la definición del manual.
Como usar esta guia
Las preguntas están organizadas en tres niveles:
- Basico: Conceptos fundamentales. Cualquier dev que ponga TypeScript en su CV debe dominar esta sección.
- Intermedio: Patrones de uso real. Aqui es donde se separan los que usaron TS en proyectos reales de los que solo hicieron un tutorial.
- Avanzado: Sistema de tipos profundo. Preguntas que hacen equipos de empresas como Microsoft, Google o startups de producto maduro.
Al final encontraras una sección de errores comunes que los entrevistadores observan activamente, y las FAQs mas buscadas sobre entrevistas de TypeScript.
Nivel Basico: Los fundamentos que no puedes fallar
1. Que es TypeScript y en que se diferencia de JavaScript?
TypeScript es un superconjunto de JavaScript desarrollado por Microsoft que agrega tipado estatico opcional al lenguaje. Todo codigo JavaScript valido es tambien TypeScript valido, lo que permite adoptarlo gradualmente en proyectos existentes.
La diferencia clave es cuándo se detectan los errores. JavaScript los muestra en tiempo de ejecucion, cuando el usuario ya está usando el producto. TypeScript los detecta en tiempo de compilacion, mientras el desarrollador escribe el codigo.
function sumar(a, b) {
return a + b;
}
sumar("5", 10);
function sumar(a: number, b: number): number {
return a + b;
}
sumar("5", 10);
Lo que el entrevistador quiere escuchar: que entiendas la diferencia entre errores en compilacion vs runtime, y que puedas dar un ejemplo concreto de por que eso importa en proyectos grandes.
2. Que es el tipado estatico y por que es util en equipos grandes?
El tipado estatico significa que los tipos de las variables se verifican antes de ejecutar el programa. En equipos de mas de dos personas, esto tiene un impacto directo en la productividad.
Cuando defines los tipos de las funciones y objetos, tu editor puede mostrarte exactamente que propiedades tiene un objeto, que argumentos espera una funcion y que devuelve. Esto reduce la necesidad de leer documentacion o buscar el codigo fuente para entender como usar algo.
function mostrarPerfil(usuario) {
console.log(usuario.nombre);
}
interface Usuario {
id: number;
nombre: string;
email: string;
rol: "admin" | "editor" | "viewer";
}
function mostrarPerfil(usuario: Usuario) {
console.log(usuario.nombre);
}
3. Cual es la diferencia entre interface y type?
Esta es una de las preguntas mas frecuentes en entrevistas de TypeScript para todos los niveles. La respuesta corta: ambas sirven para describir la forma de un objeto, pero con diferencias importantes.
Las interface son extensibles y pueden declararse multiples veces para agregar propiedades. Los type son mas flexibles porque pueden representar cualquier tipo, no solo objetos.
interface Vehiculo {
marca: string;
modelo: string;
}
interface Vehiculo {
year: number;
}
interface Carro extends Vehiculo {
puertas: number;
}
type ID = string | number;
type Punto = { x: number; y: number };
type Punto3D = Punto & { z: number };
Regla practica que los entrevistadores aprecian escuchar: usa interface para objetos que otros pueden extender (como APIs publicas de librerias) y type para todo lo demas, especialmente cuando necesitas union types o tipos calculados.
4. Que son los tipos any, unknown y never?
Estos tres tipos confunden mucho a los juniors. Aqui la diferencia concreta:
any desactiva el sistema de tipos completamente. Es la salida de emergencia que no deberias usar en codigo de produccion porque elimina todas las ventajas de TypeScript.
unknown es la alternativa segura a
any. Puedes asignarle cualquier valor, pero TypeScript te obliga a verificar el tipo antes de usarlo. Es lo correcto cuando recibes datos de una fuente externa como una API.
never representa algo que nunca deberia ocurrir. Aparece en funciones que siempre lanzan errores o en ramas de codigo que son imposibles de alcanzar.
let dato: any = "hola";
dato.metodoQueNoExiste();
let respuestaApi: unknown = fetch("/api/datos");
respuestaApi.toUpperCase();
if (typeof respuestaApi === "string") {
respuestaApi.toUpperCase();
}
function procesarRol(rol: "admin" | "editor") {
if (rol === "admin") return "Panel de admin";
if (rol === "editor") return "Panel de editor";
const casoImposible: never = rol;
return casoImposible;
}
5. Que es la inferencia de tipos?
TypeScript puede deducir el tipo de una variable sin que lo declares explicitamente. Esto reduce el codigo repetitivo sin perder seguridad de tipos.
let nombre = "Carlos";
let edad = 28;
let activo = true;
const numeros = [1, 2, 3];
function duplicar(n: number) {
return n * 2;
}
Cuándo declarar explicitamente: cuando una funcion es parte de una API publica, cuando el tipo inferido no es suficientemente especifico, o cuando quieres documentar la intencion de una variable.
Nivel Intermedio: Lo que separa la teoria de la practica
6. Como funcionan los genericos en TypeScript?
Los genericos permiten escribir funciones y clases que funcionan con multiples tipos sin perder la seguridad de tipos. Son uno de los temas mas evaluados en entrevistas de nivel intermedio y senior.
function primerElemento(arr: number[]): number {
return arr[0];
}
function primerElemento(arr: T[]): T | undefined {
return arr[0];
}
const numero = primerElemento([1, 2, 3]);
const texto = primerElemento(["a", "b", "c"]);
function obtenerPropiedad(objeto: T, clave: K): T[K] {
return objeto[clave];
}
const usuario = { nombre: "Ana", edad: 30 };
const nombre = obtenerPropiedad(usuario, "nombre");
const edad = obtenerPropiedad(usuario, "edad");
obtenerPropiedad(usuario, "email");
7. Que son los Utility Types y cuales usas mas?
TypeScript incluye tipos de utilidad predefinidos que transforman tipos existentes. Son extremadamente comunes en codebases reales y los entrevistadores los preguntan para verificar experiencia practica.
interface Producto {
id: number;
nombre: string;
precio: number;
descripcion: string;
}
function actualizarProducto(id: number, cambios: Partial) {
}
type ProductoCompleto = Required;
type ResumenProducto = Pick;
type ProductoSinId = Omit;
type ProductoCongelado = Readonly;
type InventarioPorCategoria = Record;
function obtenerConfig() {
return { apiUrl: "https://api.fencode.dev", timeout: 5000 };
}
type Config = ReturnType;
8. Como funciona el Type Narrowing?
Type narrowing es el proceso por el cual TypeScript reduce el tipo posible de una variable dentro de un bloque de codigo basandose en verificaciones.
type Respuesta = string | number | null;
function procesarRespuesta(valor: Respuesta) {
if (valor === null) {
console.log("Sin datos");
return;
}
if (typeof valor === "string") {
console.log(valor.toUpperCase());
return;
}
console.log(valor.toFixed(2));
}
type Exito = { tipo: "exito"; datos: string[] };
type Error = { tipo: "error"; mensaje: string };
type Resultado = Exito | Error;
function manejarResultado(resultado: Resultado) {
if (resultado.tipo === "exito") {
console.log(resultado.datos);
} else {
console.log(resultado.mensaje);
}
}
9. Que son los Decorators y donde se usan?
Los decorators son funciones especiales que modifican el comportamiento de clases, metodos, propiedades o parametros. Son ampliamente usados en frameworks como Angular, NestJS y en sistemas de inyeccion de dependencias.
function Loggeable(constructor: Function) {
console.log(`Clase creada: ${constructor.name}`);
}
@Loggeable
class ServicioUsuarios {
obtenerTodos() {
return [];
}
}
function Deprecated(target: any, key: string, descriptor: PropertyDescriptor) {
const metodoOriginal = descriptor.value;
descriptor.value = function (...args: any[]) {
console.warn(`Advertencia: ${key} esta deprecado`);
return metodoOriginal.apply(this, args);
};
return descriptor;
}
class ApiController {
@Deprecated
obtenerDatosV1() {
return "datos v1";
}
}
10. Como manejas correctamente null y undefined en TypeScript?
Este es un area donde mucha gente comete errores en produccion. TypeScript tiene el flag strictNullChecks que cuando esta activo (recomendado) trata null y undefined como tipos separados.
function mostrarNombre(usuario: { nombre: string } | null) {
console.log(usuario.nombre);
}
function mostrarNombre(usuario: { nombre: string } | null) {
if (usuario === null) return "Anonimo";
console.log(usuario.nombre);
}
const ciudad = usuario?.direccion?.ciudad;
const nombre = usuario?.nombre ?? "Usuario Anonimo";
Nivel Avanzado: Lo que distingue a un senior
11. Que son los Conditional Types?
Los conditional types permiten crear tipos que cambian segun condiciones, similar a un operador ternario pero para el sistema de tipos.
type EsString = T extends string ? true : false;
type Prueba1 = EsString;
type Prueba2 = EsString;
type Prueba3 = EsString;
type ElementoDeArray = T extends (infer Elemento)[] ? Elemento : never;
type MiArray = string[];
type Elemento = ElementoDeArray;
type NoNullable = T extends null | undefined ? never : T;
type MiTipo = string | number | null | undefined;
type MiTipoLimpio = NoNullable;
12. Como funcionan los Mapped Types?
Los mapped types crean nuevos tipos transformando cada propiedad de un tipo existente. Son la base de como funcionan Partial, Readonly y otros utility types internamente.
type MiPartial = {
[K in keyof T]?: T[K];
};
type MiReadonly = {
readonly [K in keyof T]: T[K];
};
type Nullable = {
[K in keyof T]: T[K] | null;
};
interface Formulario {
nombre: string;
email: string;
telefono: string;
}
type FormularioInicial = Nullable;
type Getters = {
[K in keyof T as `get${Capitalize}`]: () => T[K];
};
type GettersUsuario = Getters;
13. Que son los Template Literal Types?
Introducidos en TypeScript 4.1, permiten construir tipos de string usando interpolacion, similar a los template literals de JavaScript pero en el sistema de tipos.
type Direccion = "norte" | "sur" | "este" | "oeste";
type Movimiento = `mover-${Direccion}`;
type Entidad = "usuario" | "producto" | "orden";
type Accion = "crear" | "actualizar" | "eliminar";
type EventoSistema = `${Entidad}:${Accion}`;
function emitirEvento(evento: EventoSistema, datos: unknown) {
console.log(evento, datos);
}
emitirEvento("usuario:crear", { nombre: "Ana" });
emitirEvento("usuario:borrar", { nombre: "Ana" });
type RutasApi = {
[K in EventoSistema]: (datos: unknown) => Promise;
};
14. Como diseñarias un sistema de tipos para una API REST?
Esta es una pregunta de diseño que hacen equipos senior para evaluar como piensas sobre type safety en sistemas reales.
type RespuestaApi =
| { exito: true; datos: T; error: null }
| { exito: false; datos: null; error: string };
interface Usuario {
id: string;
nombre: string;
email: string;
}
interface Paginacion {
items: T[];
total: number;
pagina: number;
porPagina: number;
}
async function llamarApi(
url: string,
opciones?: RequestInit
): Promise<RespuestaApi> {
try {
const respuesta = await fetch(url, opciones);
if (!respuesta.ok) {
return { exito: false, datos: null, error: respuesta.statusText };
}
const datos = await respuesta.json() as T;
return { exito: true, datos, error: null };
} catch (error) {
return {
exito: false,
datos: null,
error: error instanceof Error ? error.message : "Error desconocido",
};
}
}
async function obtenerUsuarios() {
const resultado = await llamarApi<Paginacion>("/api/usuarios");
if (resultado.exito) {
resultado.datos.items.forEach((u) => console.log(u.nombre));
} else {
console.error(resultado.error);
}
}
Los 5 errores que los entrevistadores observan activamente
Usar any sin justificacion. Es la señal mas clara de que alguien no entiende el valor de TypeScript. Si necesitas flexibilidad, usa unknown y narrowing.
Confundir interface y type para casos donde uno es claramente mejor. No es que uno sea malo, es que hay contextos donde cada uno es la herramienta correcta.
No usar strictNullChecks. Un codebase sin esta opcion activa tiene una falsa sensacion de seguridad. En entrevistas, mencionar que siempre activas strict: true en tsconfig.json genera buena impresion.
Escribir tipos redundantes que TypeScript ya infiere. const nombre: string = "Ana" es redundante. El entrevistador sabe que no confias en el compilador o que no tienes experiencia real con el lenguaje.
No conocer los utility types basicos. Si en una entrevista escribes a mano lo que Partial, Pick u Omit hacen, el entrevistador sabe que no tienes experiencia en codebases reales de TypeScript.
Conclusion
Preparar una entrevista de TypeScript no es memorizar definiciones. Es entender por que el sistema de tipos existe, como usarlo para prevenir errores reales y como comunicar esas decisiones con claridad.
Los puntos que mas peso tienen en una entrevista no son los mas complejos. Son los basicos bien explicados, el conocimiento de los utility types en contextos reales y la capacidad de diseñar tipos que hagan el codigo mas facil de mantener.
Si quieres profundizar en como TypeScript se usa en proyectos reales con Next.js y APIs modernas, revisa nuestros articulos sobre MCP con TypeScript y AI agents desde cero.
Articulos relacionados