Blog
Para quem já sabe o básico e quer ir fundo. Aqui o assunto é como os modelos funcionam em produção: memória, roteamento, ferramentas, agentes. O lado técnico que pouca gente explica direito.
Por que TS não é "JS com comentários" e sim um sistema de tipos estrutural com inference poderosa. Tipos são asserções sobre o runtime; o compilador prova que o fluxo respeita essas asserções. O clique mental que muda tudo.
Narrowing via typeof, instanceof, `in`, truthiness, equality. Discriminated unions com tag field (`kind: "ok" | "err"`). Exhaustiveness check com `never`. Por que `as` quase sempre significa que você abandonou o sistema.
Generics além de `Array<T>`: constraints com `extends`, infer para extrair tipo de função/array, conditional types, variance (covariant, contravariant, invariant). Quando reescrever libs com generics robustos em vez de copiar-colar.
Partial, Required, Readonly, Pick, Omit, Record, Exclude, Extract, NonNullable, ReturnType, Awaited. O que cada um faz, quando é gambiarra (ex: Partial<T> escondendo modelagem fraca) e como prefers tipos nomeados a combinações monstruosas.
Tipo compilado não protege no runtime. Todo boundary (API, form, localStorage, query param) precisa parse com schema Zod/Valibot/io-ts. Padrão `safeParse` retornando Result. Como inferir tipo TS do schema com z.infer, fechando o loop.
Promise é um valor, não uma função. `async` wrappa função em Promise. `await` é a única forma sã de consumir. AbortController para cancelar fetch, setTimeout, streams. `Promise.all` vs `Promise.allSettled` vs `Promise.race`. Erros silenciosos em `.then` sem catch.
`throw` é goto tipado fraco — quebra inference, não aparece na assinatura, impede exhaustiveness. Result<T, E> (estilo Rust) transforma erros em retorno explícito. Biblioteca neverthrow, padrões de railway-oriented programming, quando `throw` ainda faz sentido (unrecoverable).
Event loop fases (timers, poll, check, close), libuv thread pool, sync vs async FS, Readable/Writable/Transform streams, backpressure via `pipeline()`, worker_threads quando CPU-bound. Como achar o gargalo com clinic.js, --prof e heap snapshot.
Por que times sérios usam monorepo: shared packages, atomic commits cruzando apps, CI unificada. pnpm workspaces (packages/*), Turbo pipeline.json com cache, shared tsconfig base, shared ESLint/Prettier. Anti-padrões (circular deps, shared mutáveis).
Projeto consolidando a trilha: CLI com commander/citty, flags tipadas com Zod, async com AbortController, erros via Result, publicação em npm com bin/, tests com vitest, release automático com changesets. Saída: binário usável de verdade.