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:
pnpm add -D oxlint oxlint-tsgolint@7Затем из терминала:
# правила, которым нужна информация о типах
pnpm oxlint --type-aware
# плюс диагностика компилятора TypeScript
pnpm oxlint --type-aware --type-check
# разбивка по времени для каждого правила
pnpm oxlint --type-aware --debug timingsИли закрепить настройку в .oxlintrc.json, чтобы локальный запуск и CI вели себя одинаково:
{
"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