Skip to content
← Back to rules

eslint/no-unused-vars 正しさ

This rule is turned on by default.
An auto-fix is available for this rule.

何をするか

コード内で使用されていない変数の宣言、インポート、または型の宣言を禁止します。

なぜ問題なのか

コード内で宣言されてもどこにも使われない変数は、不完全なリファクタリングによる誤りである可能性が非常に高いです。このような変数はコードに無駄なスペースを占め、読者にとって混乱を招く原因になります。

ts
// `b` は使用されていない;これはバグを示している。
function add(a: number, b: number) {
  return a;
}
console.log(add(1, 2));

以下のいずれかが真である場合、変数 foo は「使用された」と見なされます:

  • 呼び出されている(foo())または構築されている(new foo()
  • 読み込まれている(var bar = foo
  • 関数やコンストラクタに引数として渡されている(doSomething(foo)
  • 他の関数に渡された関数の中から読み込まれている(doSomething(function() { foo(); })
  • エクスポートされている(export const foo = 42
  • TypeScript の typeof 演算子のオペランドとして使用されている(const bar: typeof foo = 4

変数が単に宣言されるだけ(var foo = 5)または代入されるだけ(foo = 7)である場合、それは「使用された」とは見なされません。

このルールは、TypeScript の型、インターフェース、列挙型、名前空間に対して完全なサポートを提供しています。

型またはインターフェース Foo が以下のいずれかの方法で使用されている場合、それは「使用された」と見なされます:

  • 他の型またはインターフェースの定義で使用されている
  • 型アノテーションまたは関数シグニチャの一部として使用されている
  • キャストまたは satisfies 式で使用されている

型またはインターフェースが自分自身の定義内でのみ使用されている場合(例:type Foo = Array<Foo>)、それは「使用された」とは見なされません。

列挙型と名前空間は、変数、クラス、関数などと同じように扱われます。

無視対象のファイル

このルールは .d.ts.astro.svelte.vue ファイルを完全に無視します。.d.ts ファイル内で宣言された変数、クラス、インターフェース、型は一般的に他のファイルで使用されますが、これらのファイルは Oxlint によってチェックされません。Oxlint はテンプレート構文の解析をサポートしていないため、このルールは Vue / Svelte / Astro ファイル内の変数が使用されているかどうかを判断できません。

エクスポート済み

元の ESLint ルールでは、/* exported variableName */ コメントを使用して、別のスクリプト内で使用されている変数であることを示すことができます。このため、未使用と見なさずに済むようになります。しかしながら、現在の ES モジュールは TC39 標準となっているため、Oxlint はこの機能をサポートしていません。

このルールに対して誤りなコードの例:

javascript
/* no-unused-vars: "error" */
/* .oxlintrc.json で `some_unused_var` がグローバル変数として定義されている場合 */

// グローバル変数として定義した変数もチェック対象です
some_unused_var = 42;

var x;

// 書き込み専用の変数は使用されたと見なされません。
var y = 10;
y = 5;

// 自身の変更に対する読み取りは使用されたと見なされません。
var z = 0;
z = z + 1;

// 既定では、未使用の引数は警告を引き起こします。
(function (foo) {
  return 5;
})();

// 再帰的な未使用関数も警告を引き起こします。
function fact(n) {
  if (n < 2) return 1;
  return n * fact(n - 1);
}

// 関数定義で配列をデストラクチャリングする場合、配列内の未使用の要素も警告を引き起こします。
function getY([x, y]) {
  return y;
}
ts
type A = Array<A>;

enum Color {
  Red,
  Green,
  Blue,
}

このルールに対して正しいコードの例:

js
/* no-unused-vars: "error" */

var x = 10;
alert(x);

// foo はここで使用されたと見なされます
myFunc(
  function foo() {
    // ...
  }.bind(this),
);

(function (foo) {
  return foo;
})();

var myFunc;
myFunc = setTimeout(function () {
  // myFunc は使用されたと見なされます
  myFunc();
}, 50);

// デストラクチャリングされた配列から、2番目の引数のみが使用されています。
function getY([, y]) {
  return y;
}
ts
export const x = 1;
const y = 1;
export { y };

type A = Record<string, unknown>;
type B<T> = T extends Record<infer K, any> ? K : never;
const x = "foo" as B<A>;
console.log(x);

/* exported variableName */ 演算に対して誤りなコードの例:

js
/* exported global_var */

// 応用されません。代わりに ES モジュールを使用してください。
var global_var = 42;

設定

このルールは次のプロパティを持つ設定オブジェクトを受け入れます:

args

type: "after-used" | "all" | "none"

default: "after-used"

未使用の引数のチェック方法を制御します。

"after-used"

最後に使用された引数より前にある未使用の位置引数はチェックされませんが、すべての名前付き引数および最後に使用された引数以降のすべての位置引数はチェックされます。

"all"

すべての名前付き引数が使用されなければなりません。

"none"

引数のチェックを行いません。

argsIgnorePattern

未使用の引数に対するこのルールの例外を指定します。名前がこのパターンに一致する引数は無視されます。

デフォルトでは、このパターンは ^_ ですが、オブジェクト形式で設定された場合、[None] にデフォルト値が設定されます。この動作は、ESLint や TypeScript-ESLint とは異なり、デフォルトパターンを提供しない点が特徴です。

パターンが ^_ の場合、このオプションに対して正しいコードの例:

javascript
function foo(_a, b) {
  console.log(b);
}
foo(1, 2);

caughtErrors

type: "all" | "none"

catch ブロックの検証に使用されます。

"all"

すべての名前付き引数が使用されなければなりません。

"none"

エラー・オブジェクトのチェックを行いません。

caughtErrorsIgnorePattern

catch ブロック内でキャッチされたエラーに対するこのルールの例外を指定します。catch ブロック内で宣言された変数の名前がこのパターンに一致する場合、無視されます。

パターンが ^ignore の場合、正しいコードの例:

javascript
try {
  // ...
} catch (ignoreErr) {
  console.error("Error caught in catch block");
}

destructuredArrayIgnorePattern

このオプションは、デストラクチャリングパターン内での使用チェックの例外を指定します。配列デストラクチャリング内で宣言された変数の名前がこのパターンに一致する場合、無視されます。

デフォルトではこのパターンは未設定です。

パターンが ^_ の場合、このオプションに対して正しいコードの例:

javascript
const [a, _b, c] = ["a", "b", "c"];
console.log(a + c);

const {
  x: [_a, foo],
} = bar;
console.log(foo);

let _m, n;
foo.forEach((item) => {
  [_m, n] = item;
  console.log(n);
});

ignoreClassWithStaticInitBlock

type: boolean

default: false

ignoreClassWithStaticInitBlock オプションはブール値です。静的初期化ブロックを使用すると、クラス定義の評価時に静的変数の初期化やコードの実行が可能になり、クラスのインスタンスを作成せずに静的ブロックのコードが実行されます。このオプションを true に設定すると、静的初期化ブロックを含むクラスは無視されます。

オプション { "ignoreClassWithStaticInitBlock": true } に対して誤りなコードの例:

javascript
/* no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/

class Foo {
  static myProperty = "some string";
  static mymethod() {
    return "some string";
  }
}

class Bar {
  static {
    let baz; // 使用されていない変数
  }
}

オプション { "ignoreClassWithStaticInitBlock": true } に対して正しいコードの例:

javascript
/* no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/

class Foo {
  static {
    let bar = "some string";

    console.log(bar);
  }
}

ignoreRestSiblings

type: boolean

default: false

REST プロパティを使用することで、オブジェクトからのプロパティを「省略」できますが、デフォルトではその兄弟プロパティは「未使用」としてマークされます。このオプションを有効にすると、レストプロパティの兄弟は無視されます。

このオプションが true に設定された場合、正しいコードの例:

js
// 'foo' と 'bar' はレストプロパティの兄弟であるため無視されました。
var { foo, ...coords } = data;

var bar;
({ bar, ...coords } = data);

ignoreUsingDeclarations

type: boolean

default: false

true に設定された場合、usingawait using 宣言で宣言された変数は、使用されていなくても無視されます。

これは、明示的なリソース管理の提案に従ってリソースを破棄する必要がある場合に便利です。この場合、主な目的はリソースの破棄という副作用であり、リソース自体の使用ではありません。

オプション { "ignoreUsingDeclarations": true } に対して正しいコードの例:

javascript
/* no-unused-vars: ["error", { "ignoreUsingDeclarations": true }]*/

using resource = getResource();
await using anotherResource = getAnotherResource();

reportUsedIgnorePattern

type: boolean

default: false

reportUsedIgnorePattern オプションはブール値です。このオプションを使用すると、varsIgnorePatternargsIgnorePatterncaughtErrorsIgnorePatterndestructuredArrayIgnorePattern のいずれかの有効な無視パターンに一致する変数が実際に使用されていた場合、その変数も報告されます。

オプション { "reportUsedIgnorePattern": true } に対して誤りなコードの例:

javascript
/* no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/

var firstVarIgnored = 1;
var secondVar = 2;
console.log(firstVarIgnored, secondVar);

オプション { "reportUsedIgnorePattern": true } に対して正しいコードの例:

javascript
/* no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/

var firstVar = 1;
var secondVar = 2;
console.log(firstVar, secondVar);

reportVarsOnlyUsedAsTypes

type: boolean

default: false

reportVarsOnlyUsedAsTypes オプションはブール値です。

true に設定された場合、型としてのみ使用されている変数も報告対象になります。

オプション { "reportVarsOnlyUsedAsTypes": true } に対して誤りなコードの例:

javascript
/* no-unused-vars: ["error", { "reportVarsOnlyUsedAsTypes": true }] */

const myNumber: number = 4;
export type MyNumber = typeof myNumber

オプション { "reportVarsOnlyUsedAsTypes": true } に対して正しいコードの例:

javascript
export type MyNumber = number;

注:{ "reportVarsOnlyUsedAsTypes": false } であっても、自身の中で型としてのみ使用されるケースは依然として報告されます:

javascript
function foo(): typeof foo {}

vars

type: "all" | "local"

default: "all"

グローバルスコープでの変数の使用状況のチェック方法を制御します。

"all"

すべての変数(グローバルスコープのものも含む)が使用されているかチェックされます。

"local"

局所的に宣言された変数が使用されているかチェックされますが、グローバル変数は未使用でも許容されます。

varsIgnorePattern

未使用の変数に対するこのルールの例外を指定します。名前がこのパターンに一致する変数は無視されます。

デフォルトでは、このパターンは ^_ ですが、オブジェクト形式で設定された場合、[None] にデフォルト値が設定されます。この動作は、ESLint や TypeScript-ESLint とは異なり、デフォルトパターンを提供しない点が特徴です。

パターンが ^_ の場合、このオプションに対して正しいコードの例:

javascript
var _a = 10;
var b = 10;
console.log(b);

使い方

設定ファイルまたは CLI でこのルールを有効化するには、次のように使用できます:

json
{
  "rules": {
    "no-unused-vars": "error"
  }
}
bash
oxlint --deny no-unused-vars

参考資料