Skip to content

タイプ対応のリント(Alpha版)


Oxlintにおけるタイプ対応リントのアルファ版リリースを発表します!

概要

8月の技術プレビューに続き、タイプ対応リントがアルファ段階に到達したことをお知らせいたします。このマイルストーンにより、安定性、カスタマイズ性、ルールカバレッジの面で大きな改善が実現されました。

タイプ対応リントは、no-floating-promisesno-misused-promisesawait-thenableといった強力なルールを可能にし、TypeScriptの型システムを利用してバグを検出できます。現在、43個のタイプ対応ルールが利用可能になり、ランタイムエラーの全カテゴリを事前に発見できるようになっています。

本記事の内容:

クイックスタート

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

その他の構成オプションについては、使い方ガイドをご覧ください。

パフォーマンス

プロジェクトOxlint + タイプ対応ESLint + typescript-eslint向上率
vuejs/core2.531 s20.800 s8.22x
outline/outline4.448 s55.070 s12.38x

ベンチマークは、MacBook Pro M2 Max 12コア(性能8、効率4)にて実施しました。

パフォーマンステストの結果、oxlintのタイプ対応リントはeslinttypescript-eslintの組み合わせに比べて約10倍速いことがわかりました。詳しくはパフォーマンスベンチマークをご覧ください。

Oxlintはリント処理中にコードベースの型チェックも実行できます。タイプ対応リントの過程で多くの型情報をすでに計算しているため、重複作業を回避できます。

知られている問題

tsgolintはプロダクションコードベースでのテストに十分準備されていますが、非常に大きなコードベースでメモリ不足になる場合があります。次のマイルストーンに向けてメモリ使用量の最適化を進めております。ぜひtsgolintをお試しになり、メモリ不足の問題があればtsgolintリポジトリに報告いただき、プロジェクトの詳細情報を添えていただけると助かります。

技術プレビュー以降の新機能

リント中の型チェックに対応

tsogolintは、リント中にもっとも型チェックエラーを発行することができるようになりました。タイプ対応ルールはすでにファイル内のすべての型をチェックする必要があるため、これらの既存の型情報を使い捨てずに活用しています。つまり、一部のケースでは別途tsc --noEmitなどの型チェックコマンドを実行する必要がなくなる可能性があり、CIにおけるリントと型チェックに費やす時間が削減されます。

これは実験的な機能ですが、oxlintコマンドに--type-check--type-awareフラグを追加することで有効にできます:

$ oxlint --type-aware --type-check

  × typescript(TS2322): 型 'number' は型 'string' に割り当てできません。
   ╭─[index.ts:1:7]
 1 │ const message: string = 1
   ·       ───────
   ╰────

oxlintでのルール設定サポート

tsgolintで実行されるタイプ対応ルールは、他のリントルールと同様にoxlintで設定可能です。たとえば、no-floating-promisesルールを特定の安全な呼び出しを許可するように設定したり、voidを無視するように設定できます:

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から人気のあるルールを移植し続けることで、oxlint経由で利用できるようになっています。tsgolintoxlintの組み合わせでは、現在43個のタイプ対応ルールをサポートしています。

当初のプレビュー以降、以下のルールのサポートも追加されました:

TypeScriptプログラム診断の報告が可能に

以前は、TypeScriptがプログラムの作成や解析に失敗した場合、そのエラーが報告されず、なぜリントが動作しなかったのか不明瞭な状況になりました。今では、プログラムの作成に問題があった場合、tsconfig.jsonの設定問題など含め、診断として報告するようになっています。

たとえば、tsconfig.jsonファイルにbaseUrlが含まれている場合、TypeScript v7.0で削除されているため、エラーとして報告されます:

$ oxlint --type-aware

  × typescript(tsconfig-error): 不正な tsconfig
   ╭─[tsconfig.json:4:3]
 3 │     "compilerOptions": {
 4 │         "baseUrl": ".",
   ·         ─────────
 5 │         "experimentalDecorators": true,
   ╰────
  help: オプション 'baseUrl' は削除されました。設定から削除してください。
        詳細は https://github.com/oxc-project/tsgolint/issues/351 へ。

タイプ対応ルールの自動修正

タイプ対応ルールは現在、--fixフラグで自動修正をサポートしています。oxlint --type-aware --fixを実行すると、tsgolintからの修正可能な診断が、通常のoxlintの修正と同様に適用されます。これにより、非タイプ対応ルールとの修正ワークフローにおいて完全な同等性が実現されました。

技術詳細

アーキテクチャ

Oxlintのタイプ対応リントは、独自の二バイナリアーキテクチャを使用しています:

oxlint CLI (Rust)
  ├─ ファイル走査、無視ロジック、診断処理を担当
  ├─ タイプ対応以外のルールやカスタムJSプラグインを実行
  ├─ パスと設定を tsgolint に渡す
  └─ 結果のフォーマットと表示

tsgolint (Go)
  ├─ typescript-go を直接使用して型チェック
  ├─ タイプ対応ルールを実行
  └─ 構造化された診断を返却

この設計により、Oxlintのコア部分は高速でありながら、typescript-goを介してTypeScriptの型システムを活用できます。フロントエンドとバックエンドの分離により、oxlintはユーザー体験を制御し、tsgolintが型分析の重い処理を担当します。

TypeScript互換性

tsgolintは、typescript-goに基づいており、MicrosoftによるGoベースの書き換えが、将来のTypeScript v7.0となります。より詳しいTypeScript 7の進捗については、公式のTypeScriptブログ投稿をご覧ください。そのため、一部の機能がサポートされていない可能性があります。

重要な互換性に関する注意事項:

  • 7.0以上でのみ機能がサポートされます

  • 7.0以前の構文や廃止された機能はサポートされません

  • レガシーモードのtsconfig.jsonオプション(例:baseUrl)は、TypeScript 7.0で削除されています

    6.0以前の古い機能を使用している場合は、まずコードベースを移行する必要があります。非推奨なtsconfigオプションの更新には、TypeScript移行ガイドをご活用ください。

実装詳細

tsogolintは、typescript-goの公開APIを使用していません。代わりに、内部APIをシャミングすることでアクセス可能な形にしてコンパイルしています。当チームは、typescript-goの更新を常に監視し、必要に応じて破壊的変更を修正しています。

私たちのtypescript-goフォークは、renovatebotによって定期的に同期され、最新の改善や修正に対応しています。一度TypeScript 7.0が正式リリースされると、主枝の先端ではなく安定版リリースを追跡するようになります。

今後の予定

ベータ版リリースに向けて、以下のような改善を進めています:

  • より多くのルールをサポート - 現在、typescript-eslintの59個のタイプ対応ルールのうち43個をサポートしています。ベータ版リリースに向けて、さらにルールカバレッジを拡大する予定です。
  • パフォーマンスとメモリ使用量の改善 - 特に非常に大きなモノレポに対して、さらなるパフォーマンス最適化を進めていきます。

謝辞

以下の方々に感謝いたします:

  • typescript-goを作成してくれたTypeScriptチーム
  • 心温まる支援を提供してくれたtypescript-eslintチーム
  • tsgolintを創設してくれた@auvred
  • 継続的なパフォーマンス向上とルールオプションの実装を一手に引き受けてくれた@camchenry

使ってみよう

始めたいですか? 上記のクイックスタートセクションに進んで、タイプ対応リントをインストールして実行してください。

タイプ対応リントについてのフィードバックをぜひお聞かせください。開発ワークフローをどのように改善するか楽しみにしています。

私たちとつながろう: