Médio TypeScript
Status com tipos literais e union
Enunciado
Defina um tipo Status que pode ser 'ativo' | 'inativo' | 'pendente'. Crie uma função mostrarStatus que recebe um Status e imprime "Status: X". Depois, crie uma função proximoStatus que recebe um Status e retorna o próximo status na sequência: 'pendente' -> 'ativo', 'ativo' -> 'inativo', 'inativo' -> 'pendente'. Use um switch para garantir que todos os casos sejam tratados.
Requisitos
- O tipo
Statusdeve ser uma união de literais. - A função
mostrarStatusdeve imprimir o status. - A função
proximoStatusdeve retornar o próximo status ciclicamente. - Usar
switchcom casos para cada status.
Código inicial
type Status = 'ativo' | 'inativo' | 'pendente';
function mostrarStatus(status: Status): void {
// Seu código aqui
}
function proximoStatus(status: Status): Status {
// Seu código aqui
}
Saída esperada
Status: ativo
Status: inativo
Status: pendente
Próximo de pendente: ativo
Próximo de ativo: inativo
Próximo de inativo: pendente
Ver dica
No switch, cada case corresponde a um valor literal. O default pode lançar um erro ou retornar algo, mas como o tipo é fechado, o TypeScript sabe que todos os casos estão cobertos.
Mostrar solução
type Status = 'ativo' | 'inativo' | 'pendente';
function mostrarStatus(status: Status): void {
console.log(`Status: ${status}`);
}
function proximoStatus(status: Status): Status {
switch (status) {
case 'pendente':
return 'ativo';
case 'ativo':
return 'inativo';
case 'inativo':
return 'pendente';
}
}
// Testes
mostrarStatus('ativo');
mostrarStatus('inativo');
mostrarStatus('pendente');
console.log(`Próximo de pendente: ${proximoStatus('pendente')}`);
console.log(`Próximo de ativo: ${proximoStatus('ativo')}`);
console.log(`Próximo de inativo: ${proximoStatus('inativo')}`);
Passo a passo
- Definimos
Statuscomo união de três literais string. mostrarStatusapenas imprime o valor.proximoStatususaswitchpara mapear cada status ao próximo.- Como todos os casos são cobertos, não precisamos de
default; o TypeScript entende que a função sempre retornaStatus.
Por que funciona
O switch sobre um union de literais permite que o TypeScript verifique exaustivamente os casos. Se esquecermos algum, o compilador pode reclamar (com noImplicitReturns ou strict).
Erros comuns
- Esquecer um
case: o TypeScript pode inferir que a função pode retornarundefinede dar erro sestrictNullChecksestiver ativo. - Usar
ifem vez deswitch: também funciona, mas oswitché mais claro para múltiplos literais.
Outra forma de resolver
Poderia usar um objeto de mapeamento: const proximo: Record<Status, Status> = { pendente: 'ativo', ativo: 'inativo', inativo: 'pendente' }. Isso é mais conciso, mas menos explícito.
Saída esperada
Status: ativo
Status: inativo
Status: pendente
Próximo de pendente: ativo
Próximo de ativo: inativo
Próximo de inativo: pendente