Type Narrowing
Quando o tipo de um valor é um union — como string | number — o TypeScript não vai deixar você usar operações específicas de apenas um desses tipos até que você tenha provado qual ele realmente é. Narrowing é como você prova isso, e o verificador do TypeScript realmente acompanha essa prova.
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 do bloco if (typeof value === "string"), o TypeScript trata value como um string — value.length é válido ali mas seria um erro de compilação fora desse bloco, onde value ainda poderia ser um number.
in — verificando se uma propriedade existe
O operador in verifica se um objeto tem uma determinada propriedade, e o TypeScript usa essa verificação para reduzir entre dois formatos 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!
A seguir: módulos e a biblioteca padrão — organizando código entre arquivos, e alguns utility types que se apoiam em tudo o que foi visto até agora.