タイプ対応のリント(Alpha版)
Oxlintにおけるタイプ対応リントのアルファ版リリースを発表します!
概要
8月の技術プレビューに続き、タイプ対応リントがアルファ段階に到達したことをお知らせいたします。このマイルストーンにより、安定性、カスタマイズ性、ルールカバレッジの面で大きな改善が実現されました。
タイプ対応リントは、no-floating-promises、no-misused-promises、await-thenableといった強力なルールを可能にし、TypeScriptの型システムを利用してバグを検出できます。現在、43個のタイプ対応ルールが利用可能になり、ランタイムエラーの全カテゴリを事前に発見できるようになっています。
本記事の内容:
- クイックスタート - 数分でタイプ対応リントを開始
- パフォーマンス - ESLintと比較してどれだけ高速か
- 技術プレビュー以降の新機能 - 新機能と改善点
- 技術詳細 - タイプ対応リントの内部動作
- 今後の予定 - ベータ版リリースに向けての今後計画
クイックスタート
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その他の構成オプションについては、使い方ガイドをご覧ください。
パフォーマンス
| プロジェクト | 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、効率4)にて実施しました。
パフォーマンステストの結果、oxlintのタイプ対応リントはeslintとtypescript-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を無視するように設定できます:
{
"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から人気のあるルールを移植し続けることで、oxlint経由で利用できるようになっています。tsgolintとoxlintの組み合わせでは、現在43個のタイプ対応ルールをサポートしています。
当初のプレビュー以降、以下のルールのサポートも追加されました:
no-deprecated(最もよく要求されたルールの一つ)prefer-includesstrict-boolean-expressions
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
使ってみよう
始めたいですか? 上記のクイックスタートセクションに進んで、タイプ対応リントをインストールして実行してください。
タイプ対応リントについてのフィードバックをぜひお聞かせください。開発ワークフローをどのように改善するか楽しみにしています。
私たちとつながろう:
- Discord: 実時間の議論に参加するにはコミュニティサーバーへ
- GitHub: GitHub Discussionsでフィードバックを共有
- 課題:
oxlintのバグはoxcに、タイプ対応リントのバグはtmgolintに報告してください。


