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));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));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.