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: numbere 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
- A assinatura
function classificarIdade(idade: number): 'crianca' | 'adulto' | 'idoso'anota o parâmetro e o retorno. - O
if (idade < 12)cobre crianças e retorna o literal'crianca'. - O
else if (idade < 60)cobre adultos (12 a 59) e retorna'adulto'. - O
elsefinal cobre 60+ e retorna'idoso'. - Os três
console.logimprimem 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
returnem 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:stringnão é atribuível à união de literais. - Usar
letem vez deconstdentro 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