AnyCompiler

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