Oxlint Type-Aware Preview | The JavaScript Oxidation Compiler https://oxc.rs/blog/2025-08-17-oxlint-type-aware.html
まだプレビューではあるけど、こいつ動くぞ!って感じ。
TL;DR
oxlintでも、typescript/no-floating-promisesみたいな、TSの型情報を使ったルールが動くようになった- Biomeみたく、RustでTSの型チェッカーを簡易実装したわけではない
- 内部的には、TSのGoリライトである
typescript-goを使ったtypescript-eslint/tsgolintを使ってる- さらに厳密には、そのforkである
oxc-project/tsgolint
- さらに厳密には、そのforkである
oxlintが子プロセスでtsgolintを立てて指示を出すイメージ
まあ大事なことはだいたい告知ブログに書いてある。
現状で利用可能なルール
typescript/await-thenabletypescript/no-array-deletetypescript/no-base-to-stringtypescript/no-confusing-void-expressiontypescript/no-duplicate-type-constituentstypescript/no-floating-promisestypescript/no-for-in-arraytypescript/no-implied-evaltypescript/no-meaningless-void-operatortypescript/no-misused-promisestypescript/no-misused-spreadtypescript/no-mixed-enumstypescript/no-redundant-type-constituentstypescript/no-unnecessary-boolean-literal-comparetypescript/no-unnecessary-template-expressiontypescript/no-unnecessary-type-argumentstypescript/no-unnecessary-type-assertiontypescript/no-unsafe-argumenttypescript/no-unsafe-assignmenttypescript/no-unsafe-calltypescript/no-unsafe-enum-comparisontypescript/no-unsafe-member-accesstypescript/no-unsafe-returntypescript/no-unsafe-type-assertiontypescript/no-unsafe-unary-minustypescript/non-nullable-type-assertion-styletypescript/only-throw-errortypescript/prefer-promise-reject-errorstypescript/prefer-reduce-type-parametertypescript/prefer-return-this-typetypescript/promise-function-asynctypescript/related-getter-setter-pairstypescript/require-array-sort-comparetypescript/require-awaittypescript/restrict-plus-operandstypescript/restrict-template-expressionstypescript/return-awaittypescript/switch-exhaustiveness-checktypescript/unbound-methodtypescript/use-unknown-in-catch-callback-variable
これら40のルールがoxlint-tsgolintで実装されてて、そのすべてがoxlint側でも利用可能になってる。
https://github.com/oxc-project/tsgolint/tree/5ff6f7a748c9f98a97aa72ff767e0df27cfe3a19/internal/rules https://github.com/oxc-project/oxc/tree/0ff92745ead06ac02ac865f17f9b0df8c318e307/crates/oxc_linter/src/rules/typescript
typescript-eslintには、全部で60くらいtype-checkedなルールがあったはず。
コードを読む
個人的な本題。
npmから落とせるoxlintバイナリのエンドポイントは、OXCのリポジトリのapps/oxlintにある。
そしてまずここで、--type-awareオプションを見てる。
そして、オプションがあったらtsgolintのプロセスを実行する。
パスが解決できないとか、なんかpanicしたとか、そういう場合にはここでエラーを表示して終わり。
TsGoLintState::new().lint()
現状はこのファイルに全てが詰まってるので追いやすい。
new(cwd, config_store)- https://github.com/oxc-project/oxc/blob/87dec8284e76887c066e5f392e55c1219e082a76/crates/oxc_linter/src/tsgolint.rs#L30
tsgolintのパスを探すOXLINT_TSGOLINT_PATHという環境変数か、node_modules/.binを探してくれる
- oxlint側から渡される
config_storeに、どのルールを有効にしてるかなどの情報が入ってる
lint(paths, error_sender)pathsに対して、config_storeで指定されたルールを実行していくtsgolintはheadlessモードで子プロセスとしておき、stdin/stdoutでJSONをやり取り- 問題が見つかったら
error_senderでDiagnosticsを報告
以上、ってくらいに構造はシンプル。
tsgolintプロセスとやり取りするJSONのデータ変換と、見つかったDiagnosticをリアルタイムにバッファする処理が行数のほとんど。
oxlint側のルール実装も、それがtsgolintに投げるやつですっていうマーカーがあるだけ。
tsgolint
Goはよくわからんけどざっと見ておく。
runMain()でheadlessモードを判定して起動runHeadless()で、指定されたファイルとルールをそれぞれ実行runLinter()
TSのAPIは、typescript-goの公開されてるAPIを使っているわけではなく、独自にコンパイルして、必要なAPIをshimしてるとのこと。
そのほかにも、typescript-goに対するパッチとかもあった。
メンテナンスしていくのはそこそこ大変そうに見えるな。
今後は
これも告知ブログに書いてあるけど、巨大モノレポでのパフォーマンス改善とか、IDEサポートとか、ルール追加とか、今後に乞うご期待。
oxlintはカスタムルールをJSで書けるようになる予定があるけど、このTSの型情報も使えるように・・・ならんか流石に。
はよAIが賢くなって、TSCをRustでリライトしてくれますように。