Skip to content
← Back to rules

eslint/no-shadow 懸念

何を行うか

外側スコープで宣言された変数と同一の名前を持つローカル変数の宣言を禁止します。

なぜ問題なのか

シャドーイング(変数の隠蔽)とは、あるローカル変数がその包含スコープ内に存在する変数と同じ名前を持つことを指します。これにより、どの変数が参照されているのかわかりにくくなり、診断が困難なバグを引き起こす可能性があります。

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

js
var x = 1;
function foo() {
  var x = 2; // x は外側の x をシャドーしている
}

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

js
var x = 1;
function foo() {
  var y = 2; // 別の名前なのでシャドーは発生しない
}

設定

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

allow

type: string[]

default: []

シャドーを許可する変数名のリスト。

builtinGlobals

type: boolean

default: false

組み込みのグローバル変数のシャドーを報告するかどうか。

hoist

type: "all" | "functions" | "functions-and-types" | "never" | "types"

default: "functions-and-types"

シャドーの検証時にホイストの処理をどのように制御するか。

"all"

ホイストにより、外側の変数が宣言される前でもシャドーを報告する。

"functions"

ホイストされる関数宣言のみについてシャドーを報告する。

"functions-and-types"

ホイストされる関数および型宣言について、両方のシャドーを報告する。

"never"

外側の変数が宣言される前は、常にシャドーを報告しない。

"types"

ホイストされる型宣言のみについてシャドーを報告する。

ignoreFunctionTypeParameterNameValueShadow

type: boolean

default: true

true の場合、関数の型パラメータが値をシャドーする場合は無視する。 例: const T = 1; function foo<T>() {}

ignoreOnInitialization

type: boolean

default: false

シャドーされる変数がまだ初期化されていないと予想される場合、変数の初期化部分を無視するかどうか。

ignoreTypeValueShadow

type: boolean

default: true

true の場合、型と値が同じ名前を持つ場合は無視する。 これは TypeScript で一般的:type Foo = ...; const Foo = ...;

使用方法

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

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

参照