Cómo pasar una entrevista de TypeScript: preguntas principales
TypeScript se ha consolidado firmemente como una de las herramientas más demandadas en el desarrollo web moderno. Si te estás preparando para una entrevista técnica, conocer los fundamentos y las capacidades avanzadas de TypeScript es un requisito obligatorio. En este artículo, analizaremos las principales preguntas que suelen hacer en las entrevistas y daremos ejemplos de código para afianzar el material.
1. Tipos básicos y sus diferencias con JavaScript
En la entrevista seguramente te preguntarán sobre los tipos básicos de TypeScript y su comportamiento. La principal diferencia con JavaScript es la tipificación estática. Veamos los puntos clave.
1.1. Tipos primitivos: string, number, boolean
TypeScript añade anotación explícita de tipos. Por ejemplo:
let name: string = 'Ana';let age: number = 30;let isActive: boolean = true;Sin anotación, TypeScript infiere el tipo automáticamente (type inference).
1.2. Tipo any y unknown
any desactiva la comprobación de tipos — es mejor evitarlo. unknown es una alternativa segura, requiere comprobación antes de usarlo:
let data: unknown = 'cadena';// console.log(data.toUpperCase()); // ¡Error!if (typeof data === 'string') { console.log(data.toUpperCase()); // Ok}1.3. never y void
void— la función no devuelve nada.never— la función nunca termina (lanza un error o bucle infinito).
function throwError(msg: string): never { throw new Error(msg);}2. Interfaces y tipos (interface vs type)
Esta es una de las preguntas más frecuentes. Ambos mecanismos permiten describir la estructura de objetos, pero tienen diferencias.
2.1. Cuándo usar interface
- Para declarar contratos de objetos y clases.
- Posibilidad de extensión (declaration merging):
interface User { name: string;}interface User { age: number;}// User ahora contiene name y age2.2. Cuándo usar type
- Para uniones (union), intersecciones (intersection) y alias primitivos.
- No soporta declaration merging.
type Status = 'active' | 'inactive';type Person = { name: string } & { age: number };Pregunta de entrevista: «¿Se puede reemplazar interface por type?» — Sí, pero para clases y extensión es mejor interface.
3. Genéricos (Generics)
Los genéricos permiten crear componentes reutilizables que funcionan con cualquier tipo. Son imprescindibles para posiciones senior.
3.1. Función genérica simple
function firstElement<T>(arr: T[]): T { return arr[0];}const num = firstElement([1, 2, 3]); // numberconst str = firstElement(['a', 'b']); // string3.2. Restricciones de genéricos (extends)
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key];}const user = { name: 'Iván', age: 25 };console.log(getProperty(user, 'name')); // Iván3.3. Genéricos en interfaces
interface Repository<T> { getById(id: number): T; save(item: T): void;}A menudo preguntan: «¿Para qué sirven los genéricos si existe any?» — Los genéricos mantienen la seguridad de tipos.
4. Utility Types y capacidades avanzadas
Los tipos utilitarios incorporados (Partial, Required, Pick, Omit) son indicadores de un profundo conocimiento de TypeScript.
4.1. Partial y Required
interface Task { title: string; done: boolean;}const partialTask: Partial<Task> = { title: 'Tarea' };const requiredTask: Required<Task> = { title: 'Tarea', done: false };