Slide 1

Slide 1 text

typescript-go で変わるリンターの世界 - Flint という第三の選択肢 Tamasho Tomoya TSKaigi 2026 2026-05

Slide 2

Slide 2 text

自己紹介 名前: 玉正 智也(Tamasho Tomoya) 所属: 楽天グループ株式会社 業務: フロントとかBFF とか TypeScript は触り始めて1 年くらい typescript-eslint に少しPR を出したことがある 1

Slide 3

Slide 3 text

1. リンターの仕組み 2. ESLint とRust 製Linter 3. Flint: ハイブリッド 4. まとめ 2

Slide 4

Slide 4 text

1. リンターの仕組み 2. ESLint とRust 製Linter 3. Flint: ハイブリッド 4. まとめ 3

Slide 5

Slide 5 text

TypeScript リンターの役割 リンターはAST( 抽象構文木) ルールや型チェックルールによって コードの解析を行う それぞれのルールについて簡単に紹介する 4

Slide 6

Slide 6 text

AST ルール: 構文木を見て判定 コード例: const x = 1 == 2; ↓ パース(型情報不要) BinaryExpression ├─ operator: "==" ← ここを見る ├─ left: 1 └─ right: 2 → "==" を検出 → 警告(eqeqeq ルール) 型情報は不要で、ファイルをパースするだけなので速い 5

Slide 7

Slide 7 text

型チェックルール: 型情報で判定 コード例: async function load() { fetch('/api/data'); // ← await なし } 型グラフより: fetch() → Promise この Promise は未処理 → no-floating-promises が検出 (戻り値の型を知らないと判断できない) tsc の型解析が必要なので遅い →ESLint が遅いと言われる理由 6

Slide 8

Slide 8 text

2 種類のルール: まとめ AST ルール 構文木のみで動作 → 高速・軽量 スタイル・構文の問題を検出 型チェックルール 型情報が必要 → tsc をフル実行 型に起因するバグを検出できる → 両方必要だが、型チェックを有効にすると実行時間が遅くなる → 速度と拡張性のバランスがツール選定の主な理由 7

Slide 9

Slide 9 text

1. リンターの仕組み 2. ESLint とRust 製Linter 3. Flint: ハイブリッド 4. まとめ 8

Slide 10

Slide 10 text

ESLint 強み エコシステム最大で、多種多様なルールが存在 ルールはTypeScript/JS で記述可能 →TypeScript のルールをTypeScript で記述可 jest ・react ・import など有名プラグインが充実 弱み 型チェック時に低速になる 9

Slide 11

Slide 11 text

Rust 製Linter 強み Rust 製でESLint より高速 フォーマッター内蔵のものもある(Biome ) 弱み 型チェックルールは非対応 or 対応中 カスタムルールはRust で書く必要がある →TypeScript+Rust の知識が求められる ESLint の全てのルールをカバーしているわけではない 10

Slide 12

Slide 12 text

比較 項目 ESLint Rust 製 理想 型チェックルール あり なし あり カスタムルールの言語 TypeScript Rust TypeScript 速度 遅い 超高速 超高速 エコシステム 巨大 発展途上 巨大 11

Slide 13

Slide 13 text

1. リンターの仕組み 2. ESLint とRust 製Linter 3. Flint: ハイブリッド 4. まとめ 12

Slide 14

Slide 14 text

Flint とは Josh Goldberg さん(typescript-eslint メンテナー)が主導する実験 的OSS リンター If I Wrote a Linter, Part 1: Architecture GitHub: https://github.com/flint-fyi/flint TypeScript で書かれたルールや設定を、ネイティブ速度のコアに 委譲することで高速にできるというアイデア ESLint の拡張性とネイティブリンターの速度の両立が目標 13

Slide 15

Slide 15 text

Flint: ハイブリッドアーキテクチャ ネイティブ速度コア(typescript-go 等に委譲) └─ 高速パース + 型解析 ↓ ルールエンジン(TypeScript) └─ TS でルール記述 ↓ Lint 結果出力 ネイティブ速度の処理を委譲する設計 ルールはTypeScript — TypeScript の知識のみで記述可能 Linter の組み合わせ不要 14

Slide 16

Slide 16 text

Flint とESLint の違い クロスファイルキャッシュ 他のリンターは変更のあったファイルのみの解析を行うが、 型チェックルールは依存関係も考慮する必要がある この機能では、 変更ファイルとの依存関係のある部分のキャッシュを無効化 することで、パフォーマンスを大幅に改善 TypeScript で型安全な設定ファイル markdown やJSON などの非コードファイルも解析可能 詳しくは: What flint does differently 15

Slide 17

Slide 17 text

Flint が提供するもの 型チェックルールを高速に実行 カスタムルールをTypeScript で記述(Rust 不要) ESLint 互換で移行コストを下げる ⚠️ 注意 実用に耐えるレベルまでまだまだかかる見込み 開発が頓挫する可能性もある→OSS コントリビュートの余地がと てもある 16

Slide 18

Slide 18 text

1. リンターの仕組み 2. ESLint とRust 製Linter 3. Flint: ハイブリッド 4. まとめ 17

Slide 19

Slide 19 text

まとめ Flint はESLint の拡張性とRust 製リンターの速度を両立させること を目指す実験的プロジェクト 試すなら個人プロジェクトから、興味があればコントリビュート も面白いかも 18