Skip to content

Линтинг с информацией о типах

Режим с типами включает правила, опирающиеся на типы TypeScript: например невыполненные промисы или небезопасные присваивания. В Oxlint это реализовано через tsgolint и интегрировано в CLI и конфигурацию.

Сейчас поддерживается 59 из 61 правил с типами из typescript-eslint. Покрытие, производительность и совместимость улучшаются.

Обзор

Обязанности разделены между компонентами:

  • Oxlint (Rust)
    Обход файлов, игноры, конфигурация, правила без типов, вывод.

  • tsgolint (Go)
    Строит программы TypeScript через typescript-go, выполняет правила с типами и возвращает структурированные диагностики в Oxlint.

Установка

Нужна дополнительная зависимость:

sh
npm add -D oxlint-tsgolint@latest
sh
pnpm add -D oxlint-tsgolint@latest
sh
yarn add -D oxlint-tsgolint@latest
sh
bun add -D oxlint-tsgolint@latest

Запуск линтинга с типами

Включить можно так:

  • Флаг CLI: --type-aware
  • Корневой конфиг: options.typeAware: true

CLI:

bash
oxlint --type-aware

Корневой конфиг:

json
{
  "options": {
    "typeAware": true
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  options: {
    typeAware: true,
  },
});

При включённом режиме Oxlint выполняет обычные правила и правила с типами в пространстве имён typescript/*.

--type-aware важнее конфига. Например, oxlint --type-aware -c .oxlintrc.json включает type-aware даже при options.typeAware: false в файле.

options.typeAware и options.typeCheck задаются только в корневом конфиге. Во вложенных конфигах эти поля не используйте.

В редакторах и LSP (например VS Code) type-aware включается опцией typeAware: true; см. страницу про редакторы.

Монорепозитории и артефакты сборки

Линтинг с типами требует разрешённых типов.

В монорепо:

  • Соберите зависимые пакеты, чтобы были .d.ts
  • Перед запуском установите зависимости
bash
pnpm install
pnpm -r build
oxlint --type-aware

Диагностики проверки типов

Включите проверку типов, чтобы видеть ошибки TypeScript вместе с линтом:

bash
oxlint --type-aware --type-check

Или в корневом конфиге:

json
{
  "options": {
    "typeAware": true,
    "typeCheck": true
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  options: {
    typeAware: true,
    typeCheck: true,
  },
});

--type-check важнее конфига. Например, oxlint --type-check -c .oxlintrc.json включает проверку типов даже при options.typeCheck: false.

Этот режим может заменить отдельный шаг tsc --noEmit в CI:

bash
# раньше
tsc --noEmit
oxlint

# после
oxlint --type-aware --type-check

Настройка правил с типами

Как и остальные правила Oxlint.

json
{
  "plugins": ["typescript"],
  "rules": {
    "typescript/no-floating-promises": "error",
    "typescript/no-unsafe-assignment": "warn"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  plugins: ["typescript"],
  rules: {
    "typescript/no-floating-promises": "error",
    "typescript/no-unsafe-assignment": "warn",
  },
});

Опции совпадают с typescript-eslint.

json
{
  "plugins": ["typescript"],
  "rules": {
    "typescript/no-floating-promises": ["error", { "ignoreVoid": true }]
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  plugins: ["typescript"],
  rules: {
    "typescript/no-floating-promises": ["error", { ignoreVoid: true }],
  },
});

Комментарии отключения

Поддерживаются инлайн-комментарии:

ts
// oxlint-disable-next-line typescript/no-floating-promises
doSomethingAsync();

Неиспользуемые директивы:

bash
oxlint --type-aware --report-unused-disable-directives

Совместимость с TypeScript

Основа — typescript-go.

  • Нужен TypeScript 7.0+
  • Часть устаревших опций tsconfig не поддерживается (например baseUrl в tsconfig.json)
  • Если используются возможности, устаревшие в TS 6.0 или удалённые в 7.0, сначала мигрируйте кодовую базу
  • Некорректные опции сообщаются при --type-check

См. руководство по миграции TypeScript и при необходимости ts5to6 для tsconfig.

Стабильность

Линтинг с типами:

  • Покрытие правил не полное (но уже очень близко)
  • В очень больших проектах возможен высокий расход памяти
  • Производительность продолжают улучшать

Устранение неполадок

Производительность и отладка

Если линтинг с типами медленный или жрёт память:

  1. Обновите оба инструмента:
  • oxlint
  • oxlint-tsgolint
  1. Включите отладочный лог:
bash
OXC_LOG=debug oxlint --type-aware

Пример вывода (ключевые этапы):

2026/01/01 12:00:00.000000 Starting tsgolint
2026/01/01 12:00:00.001000 Starting to assign files to programs. Total files: 259
2026/01/01 12:00:01.000000 Done assigning files to programs. Total programs: 8. Unmatched files: 75
2026/01/01 12:00:01.001000 Starting linter with 12 workers
2026/01/01 12:00:01.001000 Workload distribution: 8 programs
2026/01/01 12:00:01.002000 [1/8] Running linter on program: /path/to/project/jsconfig.json
...
2026/01/01 12:00:01.100000 [4/8] Running linter on program: /path/to/project/tsconfig.json
2026/01/01 12:00:02.500000 Program created with 26140 source files
2026/01/01 12:00:14.000000 /path/to/project/oxlint-plugin.mts
...
2026/01/01 12:00:14.100000 [5/8] Running linter on program: /path/to/project/apps/tsconfig.json
...
2026/01/01 12:00:15.000000 Linting Complete
Finished in 16.4s on 259 files with 161 rules using 12 threads.

Как читать лог:

  • Назначение файлов (Starting to assign files...Done assigning files...): сопоставление исходников и проектов tsconfig. Должно быть быстрым; если нет — сообщите в issue.
  • Линтинг программы ([N/M] Running linter on program...): каждый проект TypeScript обрабатывается отдельно. Сильно более долгие программы могут указывать на тяжёлое разрешение типов или слишком большой проект.
    • Обратите внимание на огромное число файлов (например Program created with 26140 source files) — возможно, в include/exclude tsconfig попадает лишнее, вроде node_modules.
    • Путь файла в логе показывает момент линтинга; большие паузы между файлами могут означать дорогое разрешение типов.

Типичные проблемы производительности

Корневой tsconfig захватывает слишком много файлов

Слишком широкий include в корневом tsconfig.json может подтянуть весь репозиторий:

tsconfig.json
json
{
  "include": ["**/*"] // ❌ Catches everything
}

Вместе с артефактами сборки и лишними путями это сильно замедляет работу.

Исправление: сузьте include и добавьте exclude:

tsconfig.json
json
{
  "include": ["src/**/*"], // ✅ Only source files
  "exclude": ["dist", "build", "coverage"] // node_modules are excluded by default
}

В монорепо корневой tsconfig.json не должен напрямую включать исходники пакетов:

tsconfig.json
json
{
  "files": []
}

Диагностика: включите отладочный лог и ищите программы с аномально большим числом файлов:

2026/01/01 12:00:02.500000 Program created with 26140 source files

Если в одной программе тысячи файлов — проверьте include/exclude этого tsconfig.

Дальше