Fácil TypeScript

Formatar ID com union type

Enunciado

Crie uma função formatarId que recebe um parâmetro id do tipo number | string e retorna uma string formatada. Se for número, retorne "ID numérico: X" (com X sendo o número). Se for string, retorne "ID textual: Y" (com Y em maiúsculas). Use narrowing com typeof.

Requisitos

  • A função deve aceitar number | string.
  • Usar typeof para diferenciar os tipos.
  • Retornar a string no formato correto para cada caso.

Código inicial

function formatarId(id: number | string): string {
  // Seu código aqui
}

Saída esperada

ID numérico: 42
ID textual: ABC123
Ver dica

Dentro do if, use typeof id === 'number' para tratar números. No else, o TypeScript já sabe que é string.

Mostrar solução
function formatarId(id: number | string): string {
  // Verifica se é number
  if (typeof id === 'number') {
    return `ID numérico: ${id}`;
  }
  // Aqui id é string
  return `ID textual: ${id.toUpperCase()}`;
}

console.log(formatarId(42));
console.log(formatarId('abc123'));

Passo a passo

  1. A função recebe id com tipo number | string.
  2. Usamos typeof id === 'number' para verificar se é número.
  3. Se for número, retornamos a string formatada com o número.
  4. Caso contrário, o TypeScript infere que id é string, então usamos toUpperCase().

Por que funciona

O typeof faz o narrowing: dentro do if, o tipo de id é number; no else, é string. Isso permite chamar métodos específicos de cada tipo sem erros de compilação.

Erros comuns

  • Esquecer o typeof e tentar usar toUpperCase() diretamente: id.toUpperCase() causaria erro porque number não tem esse método.
  • Usar if (id) para verificar tipo: isso não funciona para narrowing, pois 0 é falsy.

Outra forma de resolver

Poderia usar Number.isInteger(id) para verificar se é número, mas typeof é mais direto e idiomático.

Saída esperada

ID numérico: 42
ID textual: ABC123