Fácil TypeScript

Narrowing com typeof

Enunciado

Escreva uma função formatarValor que recebe um parâmetro valor do tipo string | number. Se for string, retorne a string em maiúsculas; se for number, retorne o número com duas casas decimais como string.

Requisitos

  • Usar typeof para verificar o tipo.
  • Retornar string em ambos os casos.
  • A função deve compilar sem erros de tipo.

Código inicial

function formatarValor(valor: string | number): string {
  // Seu código aqui
}

console.log(formatarValor('typescript'));
console.log(formatarValor(3.1415));

Saída esperada

TYPESCRIPT
3.14
Ver dica

Use typeof valor === 'string' para estreitar o tipo. Lembre-se de que toFixed existe em números.

Mostrar solução
function formatarValor(valor: string | number): string {
  if (typeof valor === 'string') {
    return valor.toUpperCase(); // valor é string
  }
  return valor.toFixed(2); // valor é number
}

console.log(formatarValor('typescript')); // TYPESCRIPT
console.log(formatarValor(3.1415)); // 3.14

Passo a passo

  1. A função recebe um parâmetro valor que pode ser string ou number.
  2. Usamos typeof valor === 'string' para verificar se é string.
  3. Dentro do if, o TypeScript estreita valor para string, permitindo chamar toUpperCase().
  4. Fora do if, o TypeScript sabe que valor só pode ser number, então toFixed(2) é válido.
  5. Retornamos o resultado formatado em cada caso.

Por que funciona

O typeof é um operador que retorna uma string indicando o tipo primitivo do operando. O TypeScript entende essa verificação como um guarda de tipo, refinando a união string | number para o tipo específico dentro de cada ramo do fluxo.

Erros comuns

  • Esquecer de tratar o caso number e tentar chamar toUpperCase() fora do if:
    return valor.toUpperCase(); // Erro: Property 'toUpperCase' does not exist on type 'number'
  • Usar == em vez de === pode não estreitar corretamente em alguns casos.
  • Não retornar em todos os caminhos: o TypeScript pode reclamar que a função não retorna string em todos os casos.

Outra forma de resolver

Usar um switch com typeof:

function formatarValor(valor: string | number): string {
  switch (typeof valor) {
    case 'string': return valor.toUpperCase();
    case 'number': return valor.toFixed(2);
    default: throw new Error('Tipo não suportado');
  }
}

Útil quando há mais de dois tipos possíveis.

Saída esperada

TYPESCRIPT
3.14