AnyCompiler

Type Narrowing

Cuando el tipo de un valor es un union — como string | number — TypeScript no te dejará usar operaciones específicas de solo uno de esos tipos hasta que hayas demostrado cuál es en realidad. Narrowing es cómo lo demuestras, y el verificador de TypeScript realmente sigue esa prueba.

function describe(value: string | number): string {
  if (typeof value === "string") {
    return `String of length ${value.length}`;
  }
  return `Number: ${value.toFixed(2)}`;
}

console.log(describe("hello"));
console.log(describe(3.14159));
Output
String of length 5
Number: 3.14

Dentro del bloque if (typeof value === "string"), TypeScript trata a value como un string — value.length es válido ahí pero sería un error de compilación fuera de ese bloque, donde value todavía podría ser un number.

in — comprobar si existe una propiedad

El operador in comprueba si un objeto tiene una propiedad dada, y TypeScript usa esa comprobación para reducir entre dos formas de objeto diferentes.

interface Cat {
  meow(): string;
}

interface Dog {
  bark(): string;
}

function speak(animal: Cat | Dog): string {
  if ("meow" in animal) {
    return animal.meow();
  }
  return animal.bark();
}

const cat: Cat = { meow: () => "Meow!" };
const dog: Dog = { bark: () => "Woof!" };

console.log(speak(cat));
console.log(speak(dog));
Output
Meow!
Woof!

Siguiente: módulos y la librería estándar — organizar código entre archivos, y algunos utility types que se apoyan en todo lo visto hasta ahora.