Skip to content

Альфа типозависимого линтинга


Мы рады объявить об альфа-релизе типозависимого линтинга в Oxlint!

Обзор

После технического превью в августе типозависимый линтинг достиг статуса альфы. Это заметный шаг в стабильности, настройке и покрытии правилами.

Типозависимый линтинг включает сильные правила вроде no-floating-promises, no-misused-promises и await-thenable, которые находят баги, используя систему типов TypeScript. С 43 типозависимыми правилами можно перехватывать целые классы ошибок времени выполнения заранее.

В этой заметке:

Quick Start

Установите oxlint и oxlint-tsgolint, затем запускайте с --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

Чтобы попробовать одно типозависимое правило без остальной конфигурации (oxlint-tsgolint должен быть установлен глобально или локально):

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

Дополнительные опции — в руководстве по использованию.

Performance

ПроектOxlint + типозависимыйESLint + typescript-eslintУскорение
vuejs/core2.531 s20.800 s8.22x
outline/outline4.448 s55.070 s12.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:

json
{
  "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 — комментарием в файле или на строке:

ts
/* 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 типозависимых правила.

С момента превью добавлена поддержка в том числе:

Диагностики программы 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 выше.

Нам важна обратная связь по типозависимому линтингу.

Контакты: