Bom dia, TypeScript: como começa o dia de um desenvolvedor
\n\nImagine: 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\nNeste 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\nManhã: daily e code review
\n\n9:30 — Daily standup
\n\nReuniã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\nExemplo: vocês discutem a tipagem da resposta do servidor. Em vez de usar any, você sugere:
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\nOs colegas concordam — essa é a abordagem certa. O desenvolvedor TypeScript sabe: uma boa tipagem é meio caminho andado.
\n\n10:00 — Code review: encontrando bugs antes que eles nos encontrem
\n\nApó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:
// ❌ 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\nVocê explica: o desenvolvedor TypeScript sempre pensa nos casos extremos. Tipagem não é sobre limitações, é sobre segurança.
\n\nMeio do dia: escrevendo código e trabalhando com genéricos
\n\n11:30 — A tarefa principal do dia: refatorar legado
\n\nVocê 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\nVocê 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\nAgora o TypeScript infere automaticamente o tipo correto do resultado com base nos dados de entrada. Colegas