tsc vs esbuild: Verificação de Tipos vs Transpilação Rápida
Eles fazem trabalhos diferentes: o esbuild transpila TypeScript de forma extremamente rápida mas pula a verificação de tipos; o tsc verifica tipos (e pode emitir) mas é mais lento.
Uma confusão comum: o esbuild compila TS para JS removendo os tipos sem verificá-los, então ele nunca reporta erros de tipo. O tsc de fato verifica tipos. A maioria dos times usa o esbuild (ou swc) para fazer o build e o tsc para verificar tipos.
| tsc | esbuild | |
|---|---|---|
| Verificação de tipos | Sim (é o objetivo) | Não (só remove tipos) |
| Velocidade de transpilação | Mais lenta | Muito rápida |
| Emit/bundle | Emit, sem bundling | Transpila + faz bundle |
| Reporta erros de tipo | Sim | Nunca |
| Papel típico | Gate de tipos | Etapa de build/transpilação |
Por que você normalmente precisa dos dois
O esbuild produz JS executável rapidamente, mas como não entende o sistema de tipos, um build pode ter sucesso enquanto erros de tipo reais passam despercebidos. O tsc é a ferramenta que falha quando os tipos estão errados. Usar apenas o esbuild significa perder sua rede de segurança de tipos.
A configuração comum
Faça o build/bundle com o esbuild (ou swc) por velocidade, e rode tsc --noEmit como uma etapa separada de verificação de tipos. Isso dá builds rápidos mais verificação de tipos genuína. Localmente, o modo watch usa o esbuild por velocidade; a CI roda o tsc para impor a correção.
Em CI
Rode tsc --noEmit como seu próprio job/gate para que um build rápido do esbuild nunca esconda regressões de tipo. O esbuild mantém a etapa de build rápida; o tsc mantém os tipos honestos. Eles são complementares, não concorrentes.
O veredito
Não escolha só um: use o esbuild (ou swc) para transpilação/bundling rápidos e o tsc --noEmit para verificação de tipos. O esbuild sozinho não vai pegar erros de tipo; o tsc sozinho é mais lento para fazer o build.