Skip to content
← Back to rules

eslint/no-shadow 可疑

它的作用

禁止变量声明在外部作用域中遮蔽已声明的变量。

为什么这是个问题?

遮蔽(shadowing)是指局部变量与包含其作用域中的变量具有相同名称的过程。这可能导致混淆,因为不清楚具体引用的是哪一个变量,从而引发难以诊断的错误。

示例

以下为 不正确 的代码示例:

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

参考资料