Альфа типозависимого линтинга
Мы рады объявить об альфа-релизе типозависимого линтинга в Oxlint!
Обзор
После технического превью в августе типозависимый линтинг достиг статуса альфы. Это заметный шаг в стабильности, настройке и покрытии правилами.
Типозависимый линтинг включает сильные правила вроде no-floating-promises, no-misused-promises и await-thenable, которые находят баги, используя систему типов TypeScript. С 43 типозависимыми правилами можно перехватывать целые классы ошибок времени выполнения заранее.
В этой заметке:
- Быстрый старт — запуск типозависимого линтинга за минуты
- Производительность — насколько быстрее ESLint
- Что нового после технического превью — возможности и улучшения
- Технические детали — как это устроено
- Что дальше — планы к бете
Quick Start
Установите oxlint и oxlint-tsgolint, затем запускайте с --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-awareЧтобы попробовать одно типозависимое правило без остальной конфигурации (oxlint-tsgolint должен быть установлен глобально или локально):
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-promisesДополнительные опции — в руководстве по использованию.
Performance
| Проект | Oxlint + типозависимый | ESLint + typescript-eslint | Ускорение |
|---|---|---|---|
| vuejs/core | 2.531 s | 20.800 s | 8.22x |
| outline/outline | 4.448 s | 55.070 s | 12.38x |
Замеры на MacBook Pro M2 Max 12 ядер (8 performance и 4 efficiency).
По нашим тестам oxlint с типозависимым линтингом примерно в 10 раз быстрее ESLint с typescript-eslint. Подробнее — бенчмарки производительности.
Oxlint можно использовать для проверки типов во время линтинга. Это уменьшает дублирование работы: информация о типах уже вычисляется при типозависимом линтинге.
Известные проблемы
tsgolint уже можно пробовать на продакшен-кодовых базах, но на очень больших проектах возможны нехватка памяти. Мы работаем над оптимизацией памяти для следующего этапа. Если столкнётесь с OOM, сообщите в репозитории tsgolint с деталями проекта — это поможет улучшить использование памяти.
What's new since the technical preview?
Проверка типов во время линтинга
tsgolint теперь может выдавать ошибки проверки типов TypeScript во время линтинга. Типозависимые правила уже требуют полной проверки типов в файле, поэтому эту информацию не отбрасываем. В некоторых случаях можно обойтись без отдельной команды проверки типов (например tsc --noEmit), сократив суммарное время линтинга и typecheck в CI.
Экспериментальная возможность: флаги --type-check и --type-aware у 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
· ───────
╰────Настройка правил в oxlint
Типозависимые правила в tsgolint настраиваются в oxlint как обычные. Например, no-floating-promises с безопасными вызовами или ignoreVoid:
{
"rules": {
"typescript/no-floating-promises": [
"error",
{
"ignoreVoid": true,
"allowForKnownSafePromises": [
{ "from": "file", "name": "SafePromise" },
{ "from": "lib", "name": "PromiseLike" }
]
}
]
}
}Опции согласованы с typescript-eslint; описание — в секции конфигурации каждого правила (например no-floating-promises).
Встроенные комментарии отключения в oxlint
Правила из tsgolint можно отключать как и остальные в oxlint — комментарием в файле или на строке:
/* oxlint-disable typescript/no-floating-promises */
// oxlint-disable-next-line typescript/no-floating-promises
[1, 2, 3].map(async (x) => x + 1);Больше поддерживаемых правил
Мы продолжаем переносить популярные правила из typescript-eslint. Сейчас tsgolint вместе с oxlint поддерживает 43 типозависимых правила.
С момента превью добавлена поддержка в том числе:
no-deprecated(одно из самых запрашиваемых)prefer-includesstrict-boolean-expressions
Диагностики программы TypeScript
Раньше при сбое создания/парсинга программы TypeScript ошибки не показывались, из‑за чего было неясно, почему линтинг не работает. Теперь проблемы создания программы выводятся как диагностики, включая ошибки в tsconfig.json.
Например, при baseUrl в tsconfig.json будет ошибка: baseUrl удалён в 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.Автоисправления для типозависимых правил
Типозависимые правила поддерживают автофиксы через --fix. При oxlint --type-aware --fix исправления из tsgolint применяются как у обычного oxlint. Паритет с workflow фиксов для нетипизированных правил.
Technical details
Архитектура
Типозависимый линтинг в Oxlint использует связку из двух бинарников:
oxlint CLI (Rust)
├─ Обход файлов, ignore, диагностики
├─ Нетипозависимые правила и JS-плагины
├─ Передача путей и конфигурации в tsgolint
└─ Форматирование и вывод
tsgolint (Go)
├─ Прямое использование typescript-go для проверки типов
├─ Выполнение типозависимых правил
└─ Структурированные диагностикиТак ядро Oxlint остаётся быстрым, а система типов — через typescript-go. Разделение фронтенд/бэкенд: oxlint отвечает за UX, tsgolint — за тяжёлый анализ типов.
Совместимость с TypeScript
tsgolint основан на typescript-go — переписывании Microsoft на Go, которое станет TypeScript v7.0. Подробнее о ходе TS 7 — официальный блог TypeScript. Возможны функции, которые больше не поддерживаются.
Важно:
- Поддерживаются только возможности TypeScript 7.0+
- Синтаксис до 7.0 и устаревшие возможности не поддерживаются
- Устаревшие опции
tsconfig.jsonвродеbaseUrlудалены в TypeScript 7.0
При устаревших фичах из TypeScript 6.0 и ниже сначала мигрируйте кодовую базу. См. руководство по миграции TypeScript.
Детали реализации
tsgolint не использует публичные API typescript-go. Вместо этого компилирует typescript-go с shim внутренних API. Мы следим за обновлениями typescript-go и чиним поломки.
Форк typescript-go регулярно синхронизируется (renovatebot). После официального релиза TS 7.0 будем отслеживать стабильные версии, а не tip main.
What's next
Активно работаем над:
- Больше правил — сейчас 43 из 59 типозависимых правил
typescript-eslint; к бете планируем расширять покрытие. - Производительность и память — оптимизация, особенно для очень больших монореп.
Acknowledgements
Благодарим:
- команду TypeScript за
typescript-go; - команду
typescript-eslintза поддержку; - @auvred за
tsgolint; - @camchenry за производительность и поддержку опций правил.
Try it out
Начните с Quick Start выше.
Нам важна обратная связь по типозависимому линтингу.
Контакты:
- Discord: сервер сообщества
- GitHub: GitHub Discussions
- Issues: баги
oxlint— oxc, типозависимого линтинга — tsgolint.

