Test de TypeScript: ¿compila o no? 24 fragmentos de código

Este test de TypeScript es distinto: no hay que elegir entre cuatro opciones, sino pensar como el compilador. Cada una de las 24 preguntas es un fragmento de código, y solo tienes que decidir si tsc lo acepta con el modo estricto activado. Repasan las 8 lecciones del curso de TypeScript: tipos básicos, uniones y estrechamiento, funciones, clases, genéricos y tipos avanzados.

Exactamente la mitad compila. Al corregir verás tu nota, los aciertos por lección y, en cada pregunta, la explicación; en las que no compilan, con el mensaje real del compilador en español. Nada se envía a ningún sitio: el test se corrige en tu navegador. Todas las respuestas se comprobaron con TypeScript 7.0.2 (tsc --strict --locale es).

Pregunta 1Lección 1: Primeros pasos

¿Acepta tsc --strict este código?

function saludar(nombre) {
  return "Hola, " + nombre;
}
Pregunta 2Lección 1: Primeros pasos

¿Acepta tsc --strict este código?

function sumar(a: number, b: number) {
  return a + b;
}
const total = sumar(2, 3);
const texto: string = `Total: ${total.toFixed(2)}`;
Pregunta 3Lección 1: Primeros pasos

¿Acepta tsc --strict este código?

const resultado = console.log("listo");
console.log(resultado.toUpperCase());
Pregunta 4Lección 2: Tipos básicos

¿Acepta tsc --strict este código?

let estado = "activo";
estado = "pausado";

const fijo = "activo";
Pregunta 5Lección 2: Tipos básicos

¿Acepta tsc --strict este código?

let valor: unknown = "hola";
console.log(valor.length);
Pregunta 6Lección 2: Tipos básicos

¿Acepta tsc --strict este código?

let valor: any = "hola";
console.log(valor.lenght);
Pregunta 7Lección 3: Uniones y estrechamiento

¿Acepta tsc --strict este código?

function largo(x: string | string[]) {
  return x.length;
}
Pregunta 8Lección 3: Uniones y estrechamiento

¿Acepta tsc --strict este código?

type Forma =
  | { tipo: "circulo"; radio: number }
  | { tipo: "cuadrado"; lado: number }
  | { tipo: "triangulo"; base: number; alto: number };

function area(f: Forma): number {
  switch (f.tipo) {
    case "circulo":
      return Math.PI * f.radio ** 2;
    case "cuadrado":
      return f.lado ** 2;
  }
}
Pregunta 9Lección 3: Uniones y estrechamiento

¿Acepta tsc --strict este código?

function inicial(u: { nombre?: string }) {
  if (u.nombre) {
    return u.nombre[0].toUpperCase();
  }
  return "?";
}
Pregunta 10Lección 4: Funciones

¿Acepta tsc --strict este código?

function crear(nombre?: string, edad: number) {
  return { nombre, edad };
}
Pregunta 11Lección 4: Funciones

¿Acepta tsc --strict este código?

const doble = (n: number) => n * 2;
const textos: string[] = [1, 2, 3].map(doble);
Pregunta 12Lección 4: Funciones

¿Acepta tsc --strict este código?

type Comparador = (a: number, b: number) => number;
const primero: Comparador = (a) => a;
Pregunta 13Lección 5: Interfaces, type y clases

¿Acepta tsc --strict este código?

class Gato {
  nombre = "Michi";
}
class Perro {
  nombre = "Firulais";
}
const mascota: Gato = new Perro();
Pregunta 14Lección 5: Interfaces, type y clases

¿Acepta tsc --strict este código?

class Cuenta {
  private saldo = 100;
}
const c = new Cuenta();
console.log(c.saldo);
Pregunta 15Lección 5: Interfaces, type y clases

¿Acepta tsc --strict este código?

interface Config {
  url: string;
}
interface Config {
  puerto: number;
}
const c: Config = { url: "https://ejemplo.com" };
Pregunta 16Lección 6: Genéricos

¿Acepta tsc --strict este código?

function medir<T extends { length: number }>(x: T) {
  return x.length;
}
medir("hola");
medir([1, 2, 3]);
medir(42);
Pregunta 17Lección 6: Genéricos

¿Acepta tsc --strict este código?

function leer<T, K extends keyof T>(obj: T, clave: K) {
  return obj[clave];
}
const edad = leer({ nombre: "Ana", edad: 30 }, "edad");
const doble: number = edad * 2;
Pregunta 18Lección 6: Genéricos

¿Acepta tsc --strict este código?

interface Usuario {
  id: number;
  nombre: string;
  correo: string;
}
function actualizar(u: Usuario, cambios: Partial<Usuario>): Usuario {
  return { ...u, ...cambios };
}
Pregunta 19Lección 7: Tipos avanzados

¿Acepta tsc --strict este código?

const DIRECCIONES = ["norte", "sur"] as const;
DIRECCIONES.push("este");
Pregunta 20Lección 7: Tipos avanzados

¿Acepta tsc --strict este código?

type Color = "rojo" | "verde";
const paleta = {
  rojo: "#d00",
  verde: "#0a0",
} satisfies Record<Color, string>;
console.log(paleta.rojo.toUpperCase());
Pregunta 21Lección 7: Tipos avanzados

¿Acepta tsc --strict este código?

type Evento = `on${Capitalize<"click" | "focus">}`;
const e: Evento = "onclick";
Pregunta 22Lección 8: Un proyecto real

¿Acepta tsc --strict este código?

const datos: unknown = JSON.parse('{"edad": 30}');
if (typeof datos === "object" && datos !== null && "edad" in datos) {
  console.log(datos.edad);
}
Pregunta 23Lección 8: Un proyecto real

¿Acepta tsc --strict este código?

import { readFileSync } from "node:fs";
const texto: string = readFileSync("notas.txt");
Pregunta 24Lección 8: Un proyecto real

¿Acepta tsc --strict este código?

const config: { puerto: number } = JSON.parse('{"puerto": "8080"}');
console.log(config.puerto + 1);

Las preguntas siguen el orden del curso. Si fallas alguna, el enlace de su explicación te lleva a la lección donde se explica. ¿Quieres probar variantes? Copia el código en el editor de TypeScript y cámbialo hasta que compile, o hasta que deje de hacerlo. Y si una respuesta te sorprendió, seguramente esté en las rarezas de TypeScript.