Dia típico de um desenvolvedor TypeScript: código, bugs e code review

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Bom dia, TypeScript: como começa o dia de um desenvolvedor

\n\n

Imagine: 9h da manhã. Você abre o notebook, prepara um café e vê no Telegram uma mensagem de um colega: "Fala, ontem escrevi uma função, mas o TypeScript está reclamando do tipo unknown. Me ajuda!". Familiar? Bem-vindo ao dia típico de um desenvolvedor TypeScript. Não é só escrever código — é a arte de equilibrar tipagem forte, prazos e refatorações infinitas.

\n\n

Neste artigo, vou mostrar um dia real na vida de um dev TypeScript: da daily matinal ao commit noturno. Você verá exemplos reais de código, problemas comuns e como resolvê-los. Vamos nessa!

\n\n

Manhã: daily e code review

\n\n

9:30 — Daily standup

\n\n

Reunião rápida com o time. Você diz: "Ontem terminei o módulo de autenticação, hoje vou resolver a tipagem das respostas da API". E já ouve: "Que tal extrair as interfaces para um arquivo separado? Seguindo o code style, né?". O desenvolvedor TypeScript pensa sempre um passo à frente: interfaces, genéricos, utility types.

\n\n

Exemplo: vocês discutem a tipagem da resposta do servidor. Em vez de usar any, você sugere:

\n\n
interface ApiResponse<T> {\n  data: T;\n  error: string | null;\n  status: number;\n}\n\ntype User = {\n  id: string;\n  name: string;\n  email: string;\n};\n\n// Uso\nconst response: ApiResponse<User[]> = await fetchUsers();\n
\n\n

Os colegas concordam — essa é a abordagem certa. O desenvolvedor TypeScript sabe: uma boa tipagem é meio caminho andado.

\n\n

10:00 — Code review: encontrando bugs antes que eles nos encontrem

\n\n

Após a daily, você abre um Pull Request de um júnior. Ele escreveu uma função para validar e-mail. O código funciona, mas o TypeScript avisa: Type 'string | undefined' is not assignable to type 'string'. Você deixa um comentário:

\n\n
// ❌ Problema: null/undefined não foram tratados\nfunction validateEmail(input: string | null | undefined): boolean {\n  if (!input) return false;\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(input);\n}\n\n// ✅ Solução: usar guards e optional chaining\nfunction validateEmail(input: unknown): input is string {\n  return typeof input === 'string' && \n         input.length > 0 && \n         /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\n}\n
\n\n

Você explica: o desenvolvedor TypeScript sempre pensa nos casos extremos. Tipagem não é sobre limitações, é sobre segurança.

\n\n

Meio do dia: escrevendo código e trabalhando com genéricos

\n\n

11:30 — A tarefa principal do dia: refatorar legado

\n\n

Você pega um módulo JavaScript antigo que precisa ser reescrito em TypeScript. Lá tem uma função que aceita "qualquer coisa" e retorna "qualquer coisa". Clássico:

\n\n
// 🚫 Código JS antigo\nfunction processData(data) {\n  if (data.type === 'user') {\n    return { id: data.id, name: data.name };\n  }\n  if (data.type === 'order') {\n    return { orderId: data.id, total: data.total };\n  }\n  return null;\n}\n
\n\n

Você transforma isso em código fortemente tipado usando discriminated unions:

\n\n
// ✅ Versão TypeScript\ntype UserData = { type: 'user'; id: string; name: string };\ntype OrderData = { type: 'order'; id: string; total: number };\ntype InputData = UserData | OrderData;\n\ntype ProcessedResult<T> = T extends UserData \n  ? { id: string; name: string }\n  : T extends OrderData \n  ? { orderId: string; total: number }\n  : never;\n\nfunction processData<T extends InputData>(data: T): ProcessedResult<T> {\n  if (data.type === 'user') {\n    return { id: data.id, name: data.name } as ProcessedResult<T>;\n  }\n  return { orderId: data.id, total: data.total } as ProcessedResult<T>;\n}\n
\n\n

Agora o TypeScript infere automaticamente o tipo correto do resultado com base nos dados de entrada. Colegas

Blogs

Book Recommendations