Saltar al contenido
typescript.test.ts · devschool

Retos de TypeScript

60 preguntas ordenadas como el curso de TypeScript. Hazlas en orden o salta al tema que quieras repasar.

devschool $ 0 aciertos de 0 respondidas

¿Qué es TypeScript?

¿Te atascas? Repasa la lección ¿Qué es TypeScript?.

[TypeScript] ¿Qué pasa con los tipos de TypeScript cuando el programa se ejecuta?

[TypeScript] ¿Qué hace TypeScript con este código?
const socio = { nombre: "Lucía", cuota: 35 };
console.log(socio.couta);

[TypeScript] Declaras interface Ruta { nombre: string; km: number } y escribes const rutas = (await respuesta.json()) as Ruta[]. El servidor envía por error un texto en km. ¿Qué ocurre?

[TypeScript] Este código está en modo estricto. ¿Por qué da error la última línea?
const rutas = [{ nombre: "Cares", km: 12 }];
const ruta = rutas.find((r) => r.km > 20);
console.log(ruta.nombre);

Instalar y compilar

¿Te atascas? Repasa la lección Instalar y compilar.

[TypeScript] ¿Qué significa la opción -D en npm install -D typescript?

[TypeScript] Tu proyecto tiene un tsconfig.json con rootDir y outDir. ¿Qué comando compila todo respetando esa configuración?

[TypeScript] Con Node.js 22.18 o posterior ejecutas node src/saludo.ts, y el archivo tiene un error de tipos (asignas un string a una variable number). ¿Qué ocurre?

[TypeScript] ¿Para qué sirve npx tsc --noEmit?

Tipos básicos

¿Te atascas? Repasa la lección Tipos básicos.

[TypeScript] ¿Por qué da error la última línea?
let autor = "Patrick Rothfuss";
autor = 42;

[TypeScript] ¿Qué ocurre con esta línea?
let entrada: unknown = "  Ana  ";
console.log(entrada.trim());

[TypeScript] ¿Qué tipo infiere TypeScript para tema y para modo?
const tema = "oscuro";
let modo = "oscuro";

[TypeScript] ¿Qué pasa al ejecutar esto, si el JSON no incluye paginas?
const texto = '{"titulo": "Dune"}';
const libro = JSON.parse(texto) as { titulo: string; paginas: number };
console.log(libro.paginas.toFixed(0));

Arrays y tuplas

¿Te atascas? Repasa la lección Arrays y tuplas.

[TypeScript] ¿Qué tipo infiere TypeScript para pesos?
const pesos = ["A-12", 40, "B-07", 15];

[TypeScript] ¿Qué ocurre con la última línea?
const cima: [string, number] = ["Torre Cerredo", 2648];
console.log(cima[2]);

[TypeScript] ¿Qué hace TypeScript con esta línea?
const punto: [number, number] = [3, 4];
punto.push(5);

[TypeScript] ¿Qué error da esta llamada?
const categorias: readonly string[] = ["Escalada", "Camping"];
categorias.push("Esquí");

Objetos e interfaces

¿Te atascas? Repasa la lección Objetos e interfaces.

[TypeScript] Dado interface Socio { nombre: string; cuota: number }, ¿qué hace TypeScript con la línea siguiente?
const ana: Socio = { nombre: "Ana", cuota: 35, cuotta: 40 };

[TypeScript] ¿Por qué da error la función ahorro?
interface Producto { precio: number; descuento?: number }
function ahorro(p: Producto): number {
  return p.precio * p.descuento / 100;
}

[TypeScript] ¿Cuál de estas llamadas da error?
interface ConNombre { nombre: string }
function etiqueta(x: ConNombre): string { return `[${x.nombre}]`; }
const ruta = { nombre: "Cares", km: 12 };

[TypeScript] ¿Qué significa [codigo: string]: number dentro de una interfaz?

Uniones y alias

¿Te atascas? Repasa la lección Uniones y alias.

[TypeScript] ¿Por qué da error toUpperCase en esta función?
function formatear(valor: string | number): string {
  return valor.toUpperCase();
}

[TypeScript] ¿Qué hace TypeScript con la última línea?
type Euros = number;
type Kilos = number;
const precio: Euros = 12;
const peso: Kilos = precio;

[TypeScript] Si Producto = { nombre: string } y ConId = { id: number }, ¿cómo debe ser un objeto de tipo Producto & ConId?

[TypeScript] En una unión discriminada Pago (con campo metodo literal), ¿por qué puedes usar pago.telefono dentro de case "bizum"?

Funciones

¿Te atascas? Repasa la lección Funciones.

[TypeScript] ¿Qué error da la llamada?
function precioConIva(precio: number, iva: number): number {
  return precio * (1 + iva / 100);
}
precioConIva(50);

[TypeScript] En function f(a: number, iva = 21), ¿qué tipo tiene iva dentro de la función?

[TypeScript] ¿Cuál es la diferencia entre void y never como tipo de retorno?

[TypeScript] ¿Es válido este código?
type Manejador = (nombre: string, indice: number) => void;
const imprimir: Manejador = (nombre) => console.log(nombre);

Estrechar tipos

¿Te atascas? Repasa la lección Estrechar tipos.

[TypeScript] ¿Qué devuelve mostrarPlazas(0)?
function mostrarPlazas(plazas: number | undefined): string {
  if (plazas) {
    return `Quedan ${plazas} plazas`;
  }
  return "Sin información";
}

[TypeScript] ¿Por qué typeof x === "object" no basta para trabajar con seguridad con un objeto?

[TypeScript] Añades Hexagono a la unión Figura pero olvidas actualizar el switch. ¿Por qué se queja TypeScript en el default?
default: {
  const imposible: never = f;
  throw new Error("Figura desconocida");
}

[TypeScript] En modo estricto, ¿cómo lees e.message dentro de un catch (e)?

Clases

¿Te atascas? Repasa la lección Clases.

[TypeScript] Con strict activado, ¿qué error da esta clase?
class Ruta {
  nombre: string;
  kilometros: number;
  constructor(nombre: string) {
    this.nombre = nombre;
  }
}

[TypeScript] ¿Cuál es la diferencia real entre private de TypeScript y #campo de JavaScript?

[TypeScript] ¿Qué error da la última línea?
abstract class Actividad {
  abstract caloriasPorMinuto(): number;
}
class Natacion extends Actividad {
  caloriasPorMinuto(): number { return 9.5; }
}
const a = new Actividad();

[TypeScript] ¿Qué avisa TypeScript en esta clase hija?
class Base {
  saludar(): string { return "hola"; }
}
class Hija extends Base {
  override saludr(): string { return "buenas"; }
}

Enums y literales

¿Te atascas? Repasa la lección Enums y literales.

[TypeScript] ¿Cuál de estas construcciones genera código JavaScript al compilar?

[TypeScript] ¿Por qué da error la segunda llamada?
enum EstadoPedido { Pendiente = "PENDIENTE", Pagado = "PAGADO" }
function cobrar(estado: EstadoPedido): void {}
cobrar(EstadoPedido.Pagado);
cobrar("PAGADO");

[TypeScript] ¿Qué imprime este programa?
enum Talla { S, M, L, XL }
console.log(Talla.XL, Talla[1]);

[TypeScript] Con el objeto Rol (as const), ¿qué tipo es (typeof Rol)[keyof typeof Rol]?
const Rol = {
  Admin: "admin",
  Editor: "editor",
  Lector: "lector",
} as const;

Genéricos

¿Te atascas? Repasa la lección Genéricos.

[TypeScript] ¿Qué tipo tiene ultimaNota?
function ultimo<T>(lista: T[]): T | undefined {
  return lista[lista.length - 1];
}
const ultimaNota = ultimo([7, 9.5, 6]);

[TypeScript] ¿Cómo se arregla el error de Property 'length' does not exist on type 'T'?
function masLargo<T>(a: T, b: T): T {
  return a.length >= b.length ? a : b;
}

[TypeScript] ¿Qué hace la restricción K extends keyof T en esta función?
function obtener<T, K extends keyof T>(objeto: T, clave: K): T[K] {
  return objeto[clave];
}

[TypeScript] ¿Qué tipo tiene pendientes, si crearLista<T>(): T[] se llama sin argumentos ni tipo?
function crearLista<T>(): T[] {
  return [];
}
const pendientes = crearLista();

Tipos utilitarios

¿Te atascas? Repasa la lección Tipos utilitarios.

[TypeScript] ¿Qué permite el parámetro cambios: Partial<Producto>?
function actualizar(producto: Producto, cambios: Partial<Producto>): Producto {
  return { ...producto, ...cambios };
}

[TypeScript] Quieres el tipo de un producto sin la propiedad id. ¿Qué utilitario usas?

[TypeScript] ¿Qué error da TypeScript en etiquetas?
type Talla = "S" | "M" | "L" | "XL";
const etiquetas: Record<Talla, string> = {
  S: "Pequeña",
  M: "Mediana",
  L: "Grande",
};

[TypeScript] ¿Qué falla en este código?
function crearSesion(usuario: string) {
  return { usuario, activa: true };
}
type Sesion = ReturnType<crearSesion>;

Módulos y tsconfig

¿Te atascas? Repasa la lección Módulos y tsconfig.

[TypeScript] Dos archivos tienen const nombre = ".." y ninguno tiene import ni export. ¿Qué pasa?

[TypeScript] Proyecto Node compilado con tsc y module nodenext: ¿cómo importas ./socio.ts?

[TypeScript] Con verbatimModuleSyntax activado, ¿qué error da esta línea y cómo se arregla?
import { crearSocio, Socio } from "./socio.js";

[TypeScript] ¿Por qué la configuración típica de un proyecto Vite lleva "noEmit": true?

TypeScript y el DOM

¿Te atascas? Repasa la lección TypeScript y el DOM.

[TypeScript] ¿Por qué da error nombre.value?
const nombre = document.querySelector("#nombre");
if (nombre) {
  console.log(nombre.value);
}

[TypeScript] Dentro de un addEventListener("click") sobre una lista, evento.target es EventTarget | null. ¿Cómo lo usas con seguridad como elemento?

[TypeScript] Anotas async function cargar(): Promise<Ruta[]> y devuelves respuesta.json(). El servidor envía un formato distinto. ¿Qué pasa?

[TypeScript] Si plazas es un HTMLInputElement con valor 2, ¿qué valor tiene plazas.value + 1?

Proyecto: tareas

¿Te atascas? Repasa la lección Proyecto: tareas.

[TypeScript] ¿Qué ventaja tiene que todos los cambios (añadir, marcar, borrar) pasen por una función actualizar que guarda y vuelve a pintar?

[TypeScript] ¿Por qué almacen.ts guarda el resultado de JSON.parse en una variable unknown y aplica filter(esTarea)?

[TypeScript] ¿Por qué se usa un solo addEventListener en la lista en lugar de uno por cada botón Borrar?

[TypeScript] Abres index.html con doble clic y la aplicación no arranca. ¿Cuál es la causa más probable?