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 — colocar o lint com tipos para rodar em minutos
- Desempenho — quanto mais rápido que o ESLint
- O que mudou desde a prévia técnica — recursos e melhorias
- Detalhes técnicos — como funciona por baixo
- O que vem a seguir — planos rumo ao beta
Início rápido
Instale oxlint e oxlint-tsgolint e execute com --type-aware:
npm add -D oxlint oxlint-tsgolint@latest
npx oxlint --type-awarepnpm add -D oxlint oxlint-tsgolint@latest
pnpm oxlint --type-awareyarn add -D oxlint oxlint-tsgolint@latest
yarn oxlint --type-awarebun add -D oxlint oxlint-tsgolint@latest
bunx oxlint --type-awarePara experimentar uma única regra com reconhecimento de tipos sem o restante da configuração (oxlint-tsgolint deve estar instalado globalmente ou localmente):
npx oxlint --type-aware -A all -D typescript/no-floating-promisespnpx oxlint --type-aware -A all -D typescript/no-floating-promisesyarn oxlint --type-aware -A all -D typescript/no-floating-promisesbunx oxlint --type-aware -A all -D typescript/no-floating-promisesMais opções no guia de uso.
Desempenho
| Projeto | Oxlint + type-aware | ESLint + typescript-eslint | Ganho |
|---|---|---|---|
| vuejs/core | 2.531 s | 20.800 s | 8.22× |
| outline/outline | 4.448 s | 55.070 s | 12.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:
{
"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:
/* 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:
no-deprecated(uma das mais pedidas)prefer-includesstrict-boolean-expressions
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 estruturadosAssim 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.jsoncomobaseUrlforam 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-eslintpelo 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:
- Discord: servidor da comunidade
- GitHub: GitHub Discussions
- Issues: bugs do
oxlint— oxc; lint type-aware — tsgolint.

