TypeScript 6.0 beta: novos padrões, muitas depreciações e a ponte para o TypeScript 7

A Microsoft publicou em 11 de fevereiro o beta do TypeScript 6.0. É importante deixar claro que é um beta, não a versão final, mas ele já mostra o que vem por aí. E o que vem é uma versão de transição: segundo o anúncio, o 6.0 deve ser a última versão baseada no código atual em JavaScript. O TypeScript 7.0 será construído sobre um compilador nativo escrito em Go. O 6.0 existe, em boa parte, para preparar os projetos para esse salto.

Para testar:

npm install -D typescript@beta

Os novos padrões

A mudança que mais vai aparecer em projetos reais é a troca de valores padrão do compilador:

  • strict passa a ser true;
  • module passa a ser esnext;
  • target passa a ser a versão mais recente do ECMAScript, hoje es2025;
  • noUncheckedSideEffectImports passa a ser true;
  • libReplacement passa a ser false;
  • types passa a ser [];
  • rootDir passa a ser o diretório que contém o tsconfig.json.

O padrão de types é o que mais deve quebrar builds. Antes, o TypeScript incluía automaticamente os pacotes @types instalados; agora, muitos projetos vão precisar declarar explicitamente algo como "types": ["node"]. Se seu projeto de repente não encontra process ou Buffer, é isso.

O strict como padrão é, na minha opinião, a mudança certa e atrasada. Quase todo projeto novo já liga strict; agora o comportamento sem configuração reflete como o TypeScript é usado de verdade.

Recursos novos

Algumas adições práticas:

  • Subpath imports com #/ funcionam com moduleResolution node20, nodenext e bundler.
  • --moduleResolution bundler pode ser combinado com --module commonjs, o que ajuda projetos que ainda emitem CommonJS mas usam um bundler.
  • --stableTypeOrdering faz a ordem dos tipos bater com a do TypeScript 7.0, para facilitar a comparação durante a migração. O anúncio avisa que a flag pode deixar a checagem até 25% mais lenta e não deve ser usada como configuração permanente.
  • es2025 como target e lib, com tipos como RegExp.escape.
  • Tipos do Temporal via esnext ou temporal.esnext (a proposta está no estágio 3).
  • getOrInsert e getOrInsertComputed em Map e WeakMap, na lib esnext.
  • O conteúdo de dom.iterable e dom.asynciterable passa a fazer parte de dom; esses dois arquivos de lib agora estão vazios.

A lista de depreciações

Aqui está o coração do 6.0. Ficam depreciados ou removidos:

  • target: es5 e --downlevelIteration;
  • --moduleResolution node (node10) e classic (removido);
  • --module amd, umd e systemjs;
  • baseUrl e outFile (este removido);
  • definir esModuleInterop ou allowSyntheticDefaultImports como false, e alwaysStrict: false;
  • a palavra-chave module para namespaces, asserts em imports (substituído por with) e a diretiva no-default-lib.

Também muda o comportamento da CLI: passar arquivos na linha de comando quando existe um tsconfig.json agora gera o erro TS5112. Para ignorar a configuração, use --ignoreConfig.

Dá para silenciar as depreciações no 6.0 com "ignoreDeprecations": "6.0". Mas isso é só um adiamento: o TypeScript 7.0 remove essas opções de vez.

Como eu me prepararia

Na prática, o 6.0 é um ensaio geral para o 7.0. Minha sugestão:

  1. Instale o beta em um branch e rode a checagem de tipos sem ignoreDeprecations, para ver a lista real de problemas.
  2. Declare types explicitamente no tsconfig.json.
  3. Troque baseUrl por subpath imports ou paths relativos, e saia de moduleResolution node.
  4. Se ainda depende de es5 ou outFile, comece a planejar a saída agora, porque não haverá versão 7 com isso.

Minha leitura

O TypeScript 6.0 é uma versão que pouca gente vai achar empolgante, e tudo bem. O valor dele está em fazer o trabalho chato antes do compilador nativo chegar: limpar opções legadas, alinhar padrões com o uso real e oferecer ferramentas como --stableTypeOrdering para comparar resultados. Quem tratar o 6.0 como a hora de arrumar o tsconfig vai ter uma migração tranquila para o 7.0. Quem só ligar ignoreDeprecations e seguir em frente vai pagar a conta depois, e com juros.

Fontes