できない.dev

ESLint の no-unused-vars が無視できない

no-unused-vars は変数・引数・型・ファイル単位で抑制方法が違う。
アンダースコア prefix / disable-next-line / overrides を使い分け、意図した未使用だけ通す設定にする。

公開: 更新:

実行例あり(2026-08-02 に実環境で検証)

要約

no-unused-vars の抑制は「変数」「引数」「型」「ファイル単位」で方法が異なる。
公式の no-unused-vars ルール定義(新しいタブで開く) に従い、argsIgnorePattern_ prefix を許可するのが最も標準的な書き方。

よくある原因

  1. 未使用引数の抑制設定が無い: コールバックで (req, res, next) を全部受け取りたい場合、argsIgnorePattern を指定しないと next で怒られる
  2. 型 import を値 import している: TypeScript で import { Foo } と書くと値として扱われ、型注釈にしか使っていないと未使用判定される
  3. テストファイルだけ別ルールにしていない: テスト用ヘルパで未使用関数を残したいケースで、共通ルールが効いてしまう
  4. disable コメントの位置ミス: eslint-disable-next-line直後 1 行のみ が対象。
    ブロック全体には効かない

解決策

1. argsIgnorePattern で _ prefix を許可

// eslint.config.js
export default [
  {
    rules: {
      "no-unused-vars": [
        "error",
        {
          argsIgnorePattern: "^_",
          varsIgnorePattern: "^_",
          caughtErrorsIgnorePattern: "^_",
        },
      ],
    },
  },
];

これで (req, res, _next) => {} のように _next と書けば警告されない。

2. import type に切り替える

// before
import { User } from "./types";
type Props = { user: User };
 
// after
import type { User } from "./types";
type Props = { user: User };

TypeScript プロジェクトでは typescript-eslint の no-unused-vars(新しいタブで開く) に置き換えると、型 import を正しく扱う。

3. ファイル単位の overrides

// eslint.config.js
export default [
  { rules: { "no-unused-vars": "error" } },
  {
    files: ["**/*.test.ts", "**/*.spec.ts"],
    rules: { "no-unused-vars": "off" },
  },
];

4. disable コメントを正しく使う

// eslint-disable-next-line no-unused-vars
const unused = 1;
 
/* eslint-disable no-unused-vars */
const a = 1;
const b = 2;
/* eslint-enable no-unused-vars */

disable-next-line は直後 1 行、disable ... enable で囲むとブロック全体に効く。
乱用するとレビューの意味が薄れるので、原則は _ prefix で意図を示すのが望ましい。

実行例

実際に上記の手順を node:20 環境で動かすと、argsIgnorePattern 未設定の状態では 'next' is defined but never used が 1 エラーとして検出され終了コード 1 となる一方、_ prefix パターン設定後および eslint-disable-next-line 適用後はいずれも終了コード 0 に変わり、記事で説明した 2 つの抑制手段がそれぞれ機能することを確認できる。

v9.39.5
$ npx eslint app.js
/tmp/tmp.UUNtiIdKFk/app.js
  1:28  error  'next' is defined but never used  no-unused-vars
 
✖ 1 problem (1 error, 0 warnings)
 
eslint 終了コード: 1
$ npx eslint app.js
eslint 終了コード: 0(0 なら警告なし)
$ npx eslint app.js
eslint 終了コード: 0(0 なら抑制が効いている)

— 2026-08-02 時点の出力

検証環境

検証日
実行環境
node:20

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

この記事は役立ちましたか?