Oxlint: типизированный линтинг стал стабильным

22 июля 2026 года команда Oxc объявила типизированный линтинг (type-aware linting) в Oxlint стабильным — путь, начавшийся с альфа-версии в декабре 2025 года, завершён. Движок за этим — tsgolint v7, построенный напрямую на TypeScript v7.0.2, том же ядре на Go, которое изменило компилятор TypeScript.

Выглядит как рядовая заметка о релизе. На практике это снимает последнюю причину, по которой команды продолжали держать typescript-eslint в проекте.

Проблема: два линтера в одном пайплайне

Поколение линтеров на Rust — и Oxlint в первую очередь — дало скорость, которую не с чем было сравнивать. Но работало оно только на уровне синтаксиса: код виделся деревом токенов, о типах движок не знал ничего.

Из-за этого правила вроде no-floating-promises и no-misused-promises оставались недоступными. Это не косметика. Именно они ловят пропущенный await, брошенный промис, условие, которое никогда не станет ложным. В результате команды запускали в CI два линтера: Oxlint — для скорости, typescript-eslint — для правил, которым нужна информация о типах. Два рантайма, две конфигурации, два набора имён правил, которые надо держать в согласии.

Что изменилось

tsgolint — движок на Go, который начинался как прототип от @auvred внутри самого проекта typescript-eslint, а затем был передан организации Oxc. Вместо переписывания системы типов с нуля он опирается на официальное ядро typescript-go — то есть анализ типов совпадает с настоящим компилятором, но выполняется на скорости компилируемого языка.

Опубликованные замеры, Apple M4 Pro (12 ядер):

  • VS Code — с 83,2 с до 6,96 с (в 12× быстрее)
  • TypeScript — с 27,2 с до 1,94 с (в 14× быстрее)
  • TypeORM — с 13,2 с до 0,75 с (в 18× быстрее)
  • Vue.js — с 12,3 с до 0,95 с (в 13× быстрее)

Важнее множителя — покрытие. Стабильная версия поддерживает 59 из 61 типизированного правила из typescript-eslint: на 16 больше, чем в альфе, включая no-unnecessary-condition, prefer-optional-chain, prefer-readonly и consistent-return.

Как подключить

Типизированный линтинг поставляется отдельным бинарником рядом с Oxlint:

bash
pnpm add -D oxlint oxlint-tsgolint@7

Затем из терминала:

bash
# правила, которым нужна информация о типах
pnpm oxlint --type-aware

# плюс диагностика компилятора TypeScript
pnpm oxlint --type-aware --type-check

# разбивка по времени для каждого правила
pnpm oxlint --type-aware --debug timings

Или закрепить настройку в .oxlintrc.json, чтобы локальный запуск и CI вели себя одинаково:

json
{
  "options": {
    "typeAware": true,
    "typeCheck": true
  },
  "rules": {
    "typescript/no-floating-promises": "error",
    "typescript/no-misused-promises": "error",
    "typescript/no-unnecessary-condition": "warn"
  }
}

Разницу между двумя опциями стоит усвоить. typeAware включает правила, обращающиеся к проверяльщику типов. typeCheck дополнительно выводит собственные диагностики компилятора через линтер — то есть два ранее раздельных шага пайплайна сворачиваются в одну команду.

Оговорки из практики

  • Два правила из 61 всё ещё не поддерживаются. Прежде чем удалять typescript-eslint из репозитория, стоит сверить реально включённые правила со списком поддерживаемых. Предположение о полном паритете — типичная ошибка на этом шаге.
  • `typeAware` и `typeCheck` — опции только корневого уровня. Их нельзя включить внутри блока overrides для отдельного каталога. Флаги CLI при этом приоритетнее конфигурационного файла: удобно в CI, но сбивает с толку, когда локальный и CI-результаты расходятся.
  • Связь с версией TypeScript явная. Строка версии v7.0.2000 означает TypeScript v7.0.2 плюс патч tsgolint номер 0. Обновление TypeScript и обновление движка — одно решение, а не два, и лок-файл должен это отражать.
  • Размер установки растёт. Движок — отдельный исполняемый файл, около 21,8 МБ на ARM64 Darwin после сокращения на 26,6%. Для тонких Docker-образов это уже заметная величина.

Вывод

Направление не меняется второй год: инструментарий JavaScript уезжает из JavaScript в компилируемые языки. Анализ типов был последней частью, оставшейся за пределами этого перехода. Со стабильным tsgolint пайплайн CI может обходиться одним линтером, который понимает типы и заканчивает работу за секунды, а не за минуты.

Ценность здесь не в множителе. Она в том, что проверка, измеряемая секундами, запускается при каждом сохранении файла, а не при каждом pull request — а постоянно работающая проверка и есть та, что останавливает ошибку до попадания в ветку.

Первоисточник: Type-Aware Linting Stable — oxc.rs