Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Na rotina de desenvolvimento de aplicações complexas, é comum utilizar enums para definir conjuntos fixos de valores possíveis, como tipos de usuário, estados de uma operação ou categorias de produtos. No entanto, um problema recorrente é a possibilidade de esquecer de tratar algum desses valores em blocos de controle, como switch-case, o que pode gerar comportamentos inesperados ou bugs difíceis de detectar em tempo de execução.
Apesar do TypeScript oferecer uma forte tipagem estática, a verificação de cobertura de enums em switches não é automática. Sem uma abordagem adequada, partes do código podem ficar vulneráveis a mudanças futuras, especialmente quando novos valores são adicionados ao enum.
Para evitar esses problemas, é possível usar o tipo never em conjunto com funções auxiliares para forçar o compilador a verificar se todos os casos de um enum estão sendo tratados.
O conceito central é que, ao inserir uma chamada a uma função que aceita apenas o variável de tipo never, o compilador sinaliza um erro se algum valor do enum não foi considerado no switch. Isso funciona porque, ao tratar todos os valores explicitamente, o fluxo de controle nunca chega ao ponto de passar uma variável de enum que ainda não foi tratada.
1. Criação de uma função assertiva:
function assertUnreachable(x: never): never {
throw new Error(`Valor inesperado: ${x}`). }
2. Uso dessa função no switch padrão:
enum Status {
Pending,
Success,
Error
}
function getStatusMessage(status: Status): string {
switch (status) {
case Status.Pending:
return 'Aguardando...'. case Status.Success:
return 'Concluído com sucesso'. case Status.Error:
return 'Ocorreu um erro'. }
return assertUnreachable(status). // Força a verificação de cobertura
} Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Se algum valor de Status for adicionado futuramente e não tratado, o compilador emitirá um erro na linha de assertUnreachable, sinalizando a ausência de um caso tratado. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
3. Considerações com tipos discriminados:
Para estruturas mais complexas, como unions discriminadas, essa abordagem permite garantir que todos os ramos foram considerados, incluindo casos de extensões futuras ou de integrações externas. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
interface Circle { kind: 'circle'. radius: number. }
interface Square { kind: 'square'. side: number. }
interface Triangle { kind: 'triangle'. base: number. height: number. } O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
type Shape = Circle | Square | Triangle. function handleShape(shape: Shape) {
switch (shape.kind) {
case 'circle':
// processamento
break. case 'square':
// processamento
break. default:
// Garante que todos foram tratados
throw assertUnreachable(shape). }
} Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Embora essa técnica seja poderosa, ela exige que o desenvolvedor mantenha o switch atualizado conforme o enum evolui. Além disso, é importante configurar o TypeScript com strictNullChecks ativado para evitar que valores nulos ou indefinidos escapem na validação. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Outro ponto é que, se o enum for modificado por código externo ou por fontes não controladas, esse método ajuda a detectar rapidamente inconsistências, promovendo maior confiabilidade na lógica de controle. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Ao incorporar funções como assertUnreachable no fluxo de controle, times de desenvolvimento podem assegurar a exaustividade na manipulação de enums, reduzindo riscos de bugs e facilitando a manutenção. Essa prática eleva a confiabilidade do código, especialmente em sistemas onde mudanças frequentes de enumerações são esperadas, garantindo que toda lógica de negócio continue consistente mesmo após evoluções do sistema. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Carregando comentários...