Médio TypeScript

Função com retorno anotado e união de literais

Enunciado

Crie uma função classificarIdade que recebe idade: number e retorna 'crianca', 'adulto' ou 'idoso'. Anote explicitamente o tipo de retorno como uma união de literais. Depois teste com três idades e imprima os resultados.

Requisitos

  • A função deve ter parâmetro idade: number e retorno anotado 'crianca' | 'adulto' | 'idoso'.
  • Idade < 12 retorna 'crianca'; entre 12 e 59 retorna 'adulto'; 60 ou mais retorna 'idoso'.
  • Imprimir o resultado para 8, 30 e 70.

Código inicial

function classificarIdade(idade: number) {
  // implemente aqui
}

console.log(classificarIdade(8));
console.log(classificarIdade(30));
console.log(classificarIdade(70));

Saída esperada

crianca
adulto
idoso
Ver dica

Use if, else if e else. O tipo de retorno anotado deve ser 'crianca' | 'adulto' | 'idoso'.

Mostrar solução
// Retorno anotado como união de literais: contrato explícito
function classificarIdade(idade: number): 'crianca' | 'adulto' | 'idoso' {
  if (idade < 12) {
    return 'crianca';
  } else if (idade < 60) {
    return 'adulto';
  } else {
    return 'idoso';
  }
}

// Testes com três idades
console.log(classificarIdade(8));
console.log(classificarIdade(30));
console.log(classificarIdade(70));

Passo a passo

  1. A assinatura function classificarIdade(idade: number): 'crianca' | 'adulto' | 'idoso' anota o parâmetro e o retorno.
  2. O if (idade < 12) cobre crianças e retorna o literal 'crianca'.
  3. O else if (idade < 60) cobre adultos (12 a 59) e retorna 'adulto'.
  4. O else final cobre 60+ e retorna 'idoso'.
  5. Os três console.log imprimem os resultados para 8, 30 e 70.

Por que funciona

Anotar o retorno como união de literais documenta exatamente quais valores a função pode devolver. O compilador verifica se todos os caminhos retornam um valor compatível; se esquecermos um return, ele acusa. Isso é mais seguro do que deixar a inferência solta, que poderia ampliar o tipo para string.

Erros comuns

  • Esquecer o return em algum ramo: function f(idade: number): 'crianca' | 'adulto' | 'idoso' { if (idade < 12) return 'crianca'; } → erro: nem todos os caminhos retornam valor.
  • Retornar string genérica: return 'adulto' as string; → erro: string não é atribuível à união de literais.
  • Usar let em vez de const dentro da função não afeta o retorno, mas evite reatribuir o parâmetro.

Outra forma de resolver

Poderíamos usar um objeto de mapeamento e um único retorno:

function classificarIdade(idade: number): 'crianca' | 'adulto' | 'idoso' {
  return idade < 12 ? 'crianca' : idade < 60 ? 'adulto' : 'idoso';
}

É mais conciso, mas menos legível para muitas faixas.

Saída esperada

crianca
adulto
idoso