Skip to content

Alpha do lint com reconhecimento de tipos


Temos o prazer de anunciar o lançamento em alpha do lint com reconhecimento de tipos no Oxlint!

Visão geral

Após a prévia técnica em agosto, o lint com informação de tipos alcançou o estágio alpha — um passo importante em estabilidade, configuração e cobertura de regras.

O lint com tipos habilita regras fortes como no-floating-promises, no-misused-promises e await-thenable, que encontram bugs usando o sistema de tipos do TypeScript. Com 43 regras dependentes de tipo, é possível interceptar categorias inteiras de erros em tempo de execução antes que aconteçam.

Neste artigo:

Início rápido

Instale oxlint e oxlint-tsgolint e execute com --type-aware:

sh
npm add -D oxlint oxlint-tsgolint@latest
npx oxlint --type-aware
sh
pnpm add -D oxlint oxlint-tsgolint@latest
pnpm oxlint --type-aware
sh
yarn add -D oxlint oxlint-tsgolint@latest
yarn oxlint --type-aware
sh
bun add -D oxlint oxlint-tsgolint@latest
bunx oxlint --type-aware

Para experimentar uma única regra com reconhecimento de tipos sem o restante da configuração (oxlint-tsgolint deve estar instalado globalmente ou localmente):

sh
npx oxlint --type-aware -A all -D typescript/no-floating-promises
sh
pnpx oxlint --type-aware -A all -D typescript/no-floating-promises
sh
yarn oxlint --type-aware -A all -D typescript/no-floating-promises
sh
bunx oxlint --type-aware -A all -D typescript/no-floating-promises

Mais opções no guia de uso.

Desempenho

ProjetoOxlint + type-awareESLint + typescript-eslintGanho
vuejs/core2.531 s20.800 s8.22×
outline/outline4.448 s55.070 s12.38×

Medições em MacBook Pro M2 Max 12 núcleos (8 performance e 4 efficiency).

Em nossos testes, oxlint com lint type-aware é cerca de 10× mais rápido que o ESLint com typescript-eslint. Detalhes nos benchmarks de desempenho.

O Oxlint pode ser usado para checagem de tipos durante o lint, reduzindo trabalho duplicado: a informação de tipo já é calculada no fluxo type-aware.

Problemas conhecidos

Já é possível usar tsgolint em bases de produção, mas em projetos muito grandes pode faltar memória. Trabalhamos em otimização de memória para a próxima etapa. Se ocorrer OOM, reporte no repositório tsgolint com detalhes do projeto — isso ajuda a melhorar o uso de memória.

O que mudou desde a prévia técnica?

Verificação de tipos durante o lint

tsgolint agora pode emitir erros de verificação de tipos do TypeScript durante o lint. Como as regras type-aware já exigem análise completa dos tipos no arquivo, não descartamos essa informação. Em alguns casos dá para dispensar um comando separado de typecheck (por exemplo tsc --noEmit), reduzindo o tempo total de lint + typecheck no CI.

Recurso experimental: flags --type-check e --type-aware no oxlint:

$ oxlint --type-aware --type-check

  × typescript(TS2322): Type 'number' is not assignable to type 'string'.
   ╭─[index.ts:1:7]
 1 │ const message: string = 1
   ·       ───────
   ╰────

Configuração de regras no oxlint

Regras type-aware do tsgolint se configuram no oxlint como as demais. Por exemplo, no-floating-promises com chamadas seguras ou ignoreVoid:

json
{
  "rules": {
    "typescript/no-floating-promises": [
      "error",
      {
        "ignoreVoid": true,
        "allowForKnownSafePromises": [
          { "from": "file", "name": "SafePromise" },
          { "from": "lib", "name": "PromiseLike" }
        ]
      }
    ]
  }
}

As opções estão alinhadas ao typescript-eslint; descrição na seção de configuração de cada regra (por exemplo no-floating-promises).

Comentários de desabilitação embutidos no oxlint

Regras do tsgolint podem ser desabilitadas como no oxlint — com comentário no arquivo ou na linha:

ts
/* oxlint-disable typescript/no-floating-promises */

// oxlint-disable-next-line typescript/no-floating-promises
[1, 2, 3].map(async (x) => x + 1);

Mais regras suportadas

Seguimos portando regras populares do typescript-eslint. Hoje tsgolint com oxlint cobre 43 regras type-aware.

Desde a prévia, entre outras, passamos a suportar:

Diagnósticos do programa TypeScript

Antes, falhas ao criar/parsear o programa TypeScript não eram exibidas, o que deixava obscuro por que o lint não rodava. Agora problemas na criação do programa aparecem como diagnósticos, inclusive erros em tsconfig.json.

Por exemplo, com baseUrl em tsconfig.json: erro informando que baseUrl foi removido no TypeScript 7.0:

$ oxlint --type-aware

  × typescript(tsconfig-error): Invalid tsconfig
   ╭─[tsconfig.json:4:3]
 3 │     "compilerOptions": {
 4 │         "baseUrl": ".",
   ·         ─────────
 5 │         "experimentalDecorators": true,
   ╰────
  help: Option 'baseUrl' has been removed. Please remove it from your configuration.
        See https://github.com/oxc-project/tsgolint/issues/351 for more information.

Correções automáticas para regras type-aware

Regras type-aware suportam autofix com --fix. Com oxlint --type-aware --fix, correções do tsgolint aplicam como no oxlint usual — paridade com o fluxo de fix das regras sem tipo.

Detalhes técnicos

Arquitetura

O lint type-aware no Oxlint usa dois binários:

oxlint CLI (Rust)
  ├─ Varredura de arquivos, ignores, diagnósticos
  ├─ Regras não type-aware e plugins JS
  ├─ Repasse de caminhos e config ao tsgolint
  └─ Formatação e saída

tsgolint (Go)
  ├─ Uso direto do typescript-go para checagem de tipos
  ├─ Execução das regras type-aware
  └─ Diagnósticos estruturados

Assim o núcleo do Oxlint permanece rápido e o sistema de tipos fica no typescript-go. Separação front-end/back-end: oxlint cuida da UX, tsgolint do trabalho pesado de análise de tipos.

Compatibilidade com TypeScript

tsgolint baseia-se no typescript-go — reescrita em Go da Microsoft que será o TypeScript v7.0. Andamento do TS 7 no blog oficial do TypeScript. Alguns recursos podem deixar de ser suportados.

Importante:

  • Suporte apenas a recursos do TypeScript 7.0+
  • Sintaxe anterior a 7.0 e recursos obsoletos não são suportados
  • Opções legadas de tsconfig.json como baseUrl foram removidas no TypeScript 7.0

Com recursos obsoletos do TypeScript 6.0 ou inferior, migre a base primeiro. Veja o guia de migração do TypeScript.

Detalhes de implementação

tsgolint não usa APIs públicas do typescript-go. Em vez disso, compila o typescript-go com shim das APIs internas. Acompanhamos atualizações do typescript-go e corrigimos quebras.

O fork do typescript-go sincroniza com frequência (renovatebot). Após o lançamento oficial do TS 7.0, acompanharemos versões estáveis em vez da ponta do main.

O que vem a seguir

Trabalhamos ativamente em:

  • Mais regras — hoje 43 das 59 regras type-aware do typescript-eslint; rumo ao beta, ampliaremos a cobertura.
  • Desempenho e memória — otimizações, principalmente para monorepos muito grandes.

Agradecimentos

Agradecemos:

  • à equipe TypeScript pelo typescript-go;
  • à equipe typescript-eslint pelo apoio;
  • a @auvred pelo tsgolint;
  • a @camchenry pelo trabalho de desempenho e suporte a opções de regras.

Experimente

Comece pelo Início rápido acima.

Seu feedback sobre lint type-aware é muito importante.

Contato: