ESLint no-explicit-any 暫定許容の TODO リスト
最終更新: 2026-05-04
背景
PR #27 の lint 修正(159エラー → 0エラー)において、テストファイル・Storybookストーリー・スクリプトの @typescript-eslint/no-explicit-any エラーを一時的に ESLint override で許容しました。これらは本来 any を排除すべき箇所であり、順次適切な型に置き換える必要があります。
現在の ESLint 設定(.eslintrc.cjs)
js
overrides: [
{
// テストファイル: any を許容
files: ['**/__tests__/**', '**/*.test.ts', '**/*.test.tsx', '**/*.spec.ts', '**/*.spec.tsx'],
rules: { '@typescript-eslint/no-explicit-any': 'off' },
},
{
// Storybook ストーリー: any と exhaustive-deps を許容
files: ['**/*.stories.tsx', '**/stories/**/*.ts', '**/stories/**/*.tsx'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'react-hooks/exhaustive-deps': 'off',
},
},
{
// スクリプト: any, unused-vars, var-requires を許容
files: ['scripts/**', 'vitest.setup.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-var-requires': 'off',
'no-control-regex': 'off',
},
},
]対象ファイル一覧
テストファイル(no-explicit-any 許容中)
| ファイル | any 使用箇所の概要 |
|---|---|
electron/services/__tests__/LogWatcherService.test.ts | モックの戻り値型(12箇所) |
electron/database/__tests__/MatchRepository.test.ts | クエリ結果のキャスト |
electron/database/__tests__/ProfileRepository.test.ts | クエリ結果のキャスト |
electron/database/__tests__/StatsService.test.ts | クエリ結果のキャスト |
electron/ipc/__tests__/MatchHandlers.test.ts | IPCイベントモック |
electron/ipc/__tests__/ProfileHandlers.test.ts | IPCイベントモック(2箇所) |
electron/ipc/__tests__/SeasonHandlers.test.ts | モックの戻り値型(3箇所) |
src/store/sync/compositeAdapter.test.ts | アダプターモック |
src/store/useOverlayStore.test.ts | ストアの partial モック(3箇所) |
src/components/common/__tests__/TabErrorBoundary.test.tsx | コンポーネントprops モック |
src/components/tabs/browser-automation/hooks/__tests__/useBrowserAutomationState.test.ts | electronAPI モック |
src/components/tabs/db-viewer/components/__tests__/MatchDetailView.test.tsx | ルーター/コンテキスト モック |
src/components/tabs/db-viewer/hooks/__tests__/useMatchListState.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useLogAnalysisState.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useProfileSelection.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useRealtimeDeckTracker.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useRealtimeWatcherControls.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useStaticAnalysis.test.ts | electronAPI モック |
src/components/tabs/log-analysis/hooks/__tests__/useStatisticsComputation.test.ts | データモック |
src/components/tabs/player-dashboard/hooks/__tests__/useCharacterMatchups.test.ts | データモック |
src/components/tabs/player-dashboard/hooks/__tests__/useSeasonAnalytics.test.ts | electronAPI モック |
src/components/tabs/realtime-analysis/hooks/__tests__/useBrowserAutomation.test.ts | electronAPI モック |
src/hooks/__tests__/useMatchConverter.test.ts | electronAPI モック |
src/screens/bp-opponent/__tests__/BPOpponentContainer.test.tsx | ルーターモック |
Storybook ストーリー(no-explicit-any 許容中)
| ファイル | any 使用箇所の概要 |
|---|---|
src/stories/common/CharacterAvatarChip.stories.tsx | Story args 型 |
src/stories/common/CharacterTile.stories.tsx | Story args 型 |
src/stories/common/ControlPanelHeader.stories.tsx | Story args 型 |
src/stories/common/ProfileManager.stories.tsx | モックデータ型 |
src/stories/db-viewer/WinRatePanel.stories.tsx | Story args 型 |
src/stories/db-viewer/mocks.ts | モックデータ |
src/stories/info/AnnouncementManager.stories.tsx | Story args 型 |
src/stories/log-analysis/LogAnalysisStatisticsView.stories.tsx | Story args 型 |
src/stories/log-analysis/LogAnalysisTab.stories.tsx | Story args 型 |
src/stories/log-analysis/mocks.ts | モックデータ |
src/stories/player-dashboard/OpponentsFrequentListView.stories.tsx | Story args 型(2箇所) |
src/stories/player-dashboard/DashboardHeaderSection.stories.tsx | Story args 型 |
src/stories/player-dashboard/PlayerDashboardTab.stories.tsx | Story args 型 |
src/stories/settings/ClockSettings.stories.tsx | Story args 型 |
src/stories/settings/CustomAreaSettings.stories.tsx | Story args 型 |
src/stories/settings/FontSettings.stories.tsx | Story args 型 |
src/stories/settings/OverlayWindowSizeSection.stories.tsx | Story args 型 |
src/stories/settings/ThemeSelector.stories.tsx | Story args 型 |
スクリプト(no-explicit-any + no-unused-vars 許容中)
| ファイル | any 使用箇所の概要 |
|---|---|
scripts/debug/compare-log-parsers.ts | パーサー出力の型(10箇所) |
scripts/debug/check-picks.ts | DBクエリ結果 |
scripts/debug/verify_available_chars.ts | DBクエリ結果 |
scripts/debug/verify_db_available_chars.ts | DBクエリ結果 |
scripts/debug/verify_db_schema_logic.ts | DBクエリ結果 |
scripts/log/analyze-log/index.ts | パーサー出力 |
scripts/simulate-stream.ts | ストリームデータ |
その他
| ファイル | 内容 |
|---|---|
vitest.setup.ts | window.electronAPI の型キャスト(2箇所) |
修正アプローチ案
優先度 高: テストファイル
テストのモックにおける any は、モック対象の実際の型インターフェースを定義することで解消できます。
typescript
// Before
const mockDb = {
getMatches: vi.fn().mockResolvedValue([]),
} as any;
// After
const mockDb = {
getMatches: vi.fn().mockResolvedValue([]),
} as unknown as ElectronDatabaseAPI;または、vi.fn<ActualType>() で型付きモック関数を使用。
優先度 中: Storybook ストーリー
Storybook の StoryObj ジェネリクスにコンポーネントの props 型を渡すことで解消。
typescript
// Before
export const Default: Story = { args: { data: mockData as any } };
// After
export const Default: StoryObj<typeof MyComponent> = { args: { data: mockData } };優先度 低: スクリプト・デバッグツール
スクリプトやデバッグツールは運用コードではないため、最優先度ではありません。必要に応じて対応。
進捗トラッキング
このファイルの各エントリを修正したら、該当行を取り消し線でマークし、overrides から該当ルールを削除できるか確認してください。全ファイルの修正が完了したら、ESLint override を削除し、このドキュメントも削除します。