Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao desenvolver aplicações React com React Router e TypeScript, um desafio comum é garantir que a navegação dinâmica funcione corretamente, especialmente ao utilizar o hook useHistory para redirecionar o usuário com dados adicionais. Este artigo aborda uma situação prática enfrentada por muitos desenvolvedores: o erro de tipo ao passar um objeto com propriedades não reconhecidas na função history.push.
Imagine uma componente funcional que precisa redirecionar o usuário após uma ação, passando informações no estado da navegação. O código típico inclui a chamada de useHistory e uma navegação condicional ao atingir um determinado progresso. A tentativa de passar um objeto com propriedades como pathname e state resulta em erro de compilação, indicando que o objeto não é compatível com o tipo esperado por TypeScript. A decisão fica mais saudável quando o time consegue medir o impacto depois.
O erro ocorre porque a assinatura de history.push no React Router v5 define que seu parâmetro é do tipo 'To', que aceita um caminho de string ou um objeto de rota. No entanto, a definição de 'To' no pacote de tipagens limita as propriedades reconhecidas, não incluindo 'state' como parte do objeto padrão. Assim, passar um objeto com 'pathname' e 'state' causa conflito, pois TypeScript espera um objeto de rota com propriedades específicas. 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.
Para solucionar o problema, é necessário informar ao TypeScript que o objeto passado para history.push é do tipo correto. Isso pode ser feito criando uma interface que estenda o tipo 'To' ou usando uma asserção de tipo. Por exemplo, definir explicitamente que o objeto possui as propriedades de 'To' mais o 'state' customizado. Assim, o TypeScript reconhece o objeto como válido, eliminando o erro. 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.
import { To } from 'react-router-dom'. interface CustomTo extends To {
state?: { userAnswers?: UserAnswers }. }
// Dentro do componente
if (progress === 100) {
const id = uuid(). const destino: CustomTo = {
pathname: `/p/${id}`,
state: { userAnswers },
}. history.push(destino). } Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Outra alternativa é fazer uma asserção direta:
history.push({
pathname: `/p/${id}`,
state: { userAnswers },
} as unknown as To).
Porém, usar uma interface explícita é mais seguro e claro, além de facilitar futuras manutenções. 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.
A principal limitação é que a tipagem padrão do React Router pode não reconhecer propriedades adicionais, levando a erros ou warnings. Criar interfaces personalizadas ajuda na integração com TypeScript, mas aumenta a complexidade de tipos, especialmente se o projeto evoluir para múltiplas rotas com diferentes dados. 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. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. 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.
Outro ponto é a compatibilidade com versões futuras do React Router, pois alterações na API podem exigir atualizações nas declarações de tipos. Assim, sempre valide a documentação oficial e os tipos utilizados. 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. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. 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.
1. Identifique o erro de tipo ao usar history.push com objetos complexos.
2. Crie uma interface que estenda 'To' incluindo o 'state' desejado.
3. Use essa interface para tipar o objeto de destino na navegação.
4. Teste a navegação e a passagem de dados para assegurar que os dados estão acessíveis na página destino.
5. Mantenha a documentação do seu projeto atualizado quanto às versões de dependências e tipos.
Implementar essa abordagem garante uma navegação mais segura, com tipagem explícita que previne erros em tempo de compilação e melhora a manutenção do código. Assim, evita-se surpresas na produção e mantém-se o fluxo de navegação fluido e confiável. 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Carregando comentários...