Médio TypeScript
Usando união de literais e as const
Enunciado
Crie um tipo Status como união de literais: 'active' | 'inactive' | 'pending'. Depois, crie um objeto const StatusValues com as propriedades Active, Inactive e Pending usando as const, de forma que os valores sejam exatamente essas strings. Escreva uma função getStatusMessage(status: Status): string que retorna uma mensagem descritiva para cada status. Teste com StatusValues.Active e StatusValues.Pending.
Requisitos
- Definir
type Statuscomo união de literais. - Criar
StatusValuescomas constcontendo as três propriedades. - Implementar
getStatusMessageque retorna mensagens específicas para cada status. - Chamar a função com
StatusValues.ActiveeStatusValues.Pendinge imprimir.
Código inicial
// Defina o tipo Status
// Crie o objeto StatusValues com as const
// Implemente getStatusMessage
// Teste com StatusValues.Active e StatusValues.Pending
Saída esperada
Status active: Usuário ativo
Status pending: Aguardando aprovação
Ver dica
Use typeof StatusValues[keyof typeof StatusValues] para extrair o tipo dos valores do objeto, ou simplesmente defina a união manualmente. A função pode usar um switch ou um mapa de mensagens.
Mostrar solução
// Tipo união de literais
type Status = 'active' | 'inactive' | 'pending';
// Objeto com as const para valores imutáveis
const StatusValues = {
Active: 'active',
Inactive: 'inactive',
Pending: 'pending'
} as const;
// Função que retorna mensagem baseada no status
function getStatusMessage(status: Status): string {
switch (status) {
case StatusValues.Active:
return 'Usuário ativo';
case StatusValues.Inactive:
return 'Usuário inativo';
case StatusValues.Pending:
return 'Aguardando aprovação';
default:
// Nunca deve chegar aqui, mas o TypeScript exige exaustividade
const _exhaustive: never = status;
return _exhaustive;
}
}
// Testes
console.log(`Status ${StatusValues.Active}: ${getStatusMessage(StatusValues.Active)}`);
console.log(`Status ${StatusValues.Pending}: ${getStatusMessage(StatusValues.Pending)}`);
Passo a passo
- Definimos o tipo
Statuscomo união de três strings literais. - Criamos
StatusValuescomas const, o que faz com que cada propriedade tenha tipo literal (ex.:'active'). - A função
getStatusMessagerecebe um parâmetro do tipoStatus. - Usamos
switchpara comparar com os valores deStatusValues. Como são literais, o TypeScript verifica se todos os casos são cobertos. - No
default, usamosneverpara garantir que todos os casos foram tratados (exaustividade). - Chamamos a função com
StatusValues.ActiveeStatusValues.Pendinge imprimimos.
Por que funciona
as const torna o objeto imutável e preserva os tipos literais de suas propriedades. Assim, StatusValues.Active tem tipo 'active', que é compatível com a união Status. A verificação de exaustividade com never ajuda a evitar esquecimento de casos.
Erros comuns
- Esquecer
as const: sem ele,StatusValues.Activeseria inferido comostring, causando erro ao passar paragetStatusMessage. - Não tratar todos os casos: se faltar um
case, o TypeScript não reclama automaticamente a menos que você useneverno default. - Usar
StatusValues.Activecomo tipo:StatusValues.Activeé um valor, não um tipo. Para o tipo, usetypeof StatusValues.Active.
Outra forma de resolver
Usar um enum:
enum Status {
Active = 'active',
Inactive = 'inactive',
Pending = 'pending'
}
Mas isso gera código extra. A união de literais é mais leve.
Saída esperada
Status active: Usuário ativo
Status pending: Aguardando aprovação