Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao migrar lógica de Java para TypeScript, um dos desafios mais comuns é lidar com funções que podem lançar exceções. No Java, podemos declarar explicitamente uma função que lança uma exceção com a palavra-chave 'throws', permitindo ao desenvolvedor saber que precisa tratar esse erro na hora de chamar a função. Em TypeScript, a situação é diferente, pois a linguagem não possui uma declaração equivalente, o que gera dúvidas na hora de garantir a robustez do código.
Em Java, é fácil entender quando uma função pode lançar uma exceção, pois a assinatura do método informa isso. No TypeScript, a linguagem não força a declaração de erros na assinatura, o que potencialmente leva a códigos menos seguros. Como consequência, é comum que funções que lançam erros não sejam claramente identificadas, aumentando o risco de chamadas não tratadas e dificultando a manutenção. 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 sistema de tipos do TypeScript inclui o tipo 'never', que indica funções que não retornam normalmente — ou seja, que sempre lançam uma exceção ou entram em loop infinito. Apesar disso, o uso de 'never' não obriga o desenvolvedor a tratar exceções na chamada, apenas serve como pista de que a função pode não concluir normalmente. Além disso, funções que retornam valores e podem lançar erros geralmente têm assinaturas que misturam tipos, como 'boolean | never', mas essa não é uma prática comum ou recomendada para controle de fluxo. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Para melhorar a clareza do código, uma estratégia é marcar funções que sempre lançam erro com o tipo 'never'. Por exemplo:
function lancarErro(): never {
throw new Error('Erro fatal'). }
// Uso
lancarErro(). // o TypeScript entende que essa função não retorna 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.
Com isso, o compilador reconhece que essa função não passa do ponto, ajudando na leitura e na análise estática. Ainda assim, ela não obriga o uso de try/catch, pois o TypeScript não possui essa conexão automática. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Se uma função pode lançar erro dependendo de condições, a assinatura pode ser algo como: 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
function verificarCondicao(cond: boolean): boolean | never {
if (cond) {
return true. }
throw new Error('Condição não satisfeita'). }
Esse padrão informa ao leitor que, em certos casos, a função não retornará normalmente, mas o TypeScript não força o tratamento na chamada. Para garantir que o erro seja tratado, é preciso usar try/catch ou validar o resultado. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Apesar de ser possível usar 'never' para marcar funções que sempre lançam erro, essa abordagem não substitui a necessidade de boas práticas de tratamento de exceções. O TypeScript não força o uso de try/catch, então o desenvolvedor deve estar atento ao fluxo da aplicação. Além disso, essa estratégia não impede que chamadas a funções que podem lançar erros fiquem sem tratamento, o que pode levar a falhas silenciosas em produção. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. 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. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
1. Considere marcar funções que sempre lançam erro com o tipo 'never' para melhorar a legibilidade.
2. Para funções que podem lançar ou não, deixe claro na assinatura, mas entenda que o TypeScript não obriga o tratamento.
3. Adote boas práticas de validação e tratamento de erro ao chamar funções potencialmente problemáticas, usando try/catch ou verificações explícitas.
4. Documente claramente nas assinaturas de funções o comportamento esperado, especialmente em contextos críticos.
Embora o TypeScript não tenha uma declaração de exceções como Java, o uso inteligente do tipo 'never' ajuda a indicar funções que não retornam normalmente, melhorando a clareza do código. Ainda assim, a responsabilidade de tratar ou validar erros permanece com o desenvolvedor. Incorporar essas práticas pode evitar surpresas em produção e facilitar a manutenção de código assíncrono ou com muitos pontos de falha potencial. 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. 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...