eslint/no-unused-vars 正确性
作用
禁止在代码中未使用的变量声明、导入或类型声明。
存在哪些问题?
声明变量但未在代码中使用的可能性很高,这是由于没有完成重构所致。此类变量占用代码空间,并且会给读者造成困惑。
ts
// `b` is unused; this indicates a bug.
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
文件和 .vue
文件。在 .d.ts
文件中声明的变量、类、接口和类型通常由 Oxlint 未检查的其他文件使用。由于 Oxlint 不支持解析 Vue 模板,此规则无法判断变量在 Vue 文件中是否已使用或未使用。
导出
最初的 ESLint 规则将 /* exported variableName */
注释识别为一种指示变量在另一脚本中使用且不应被视为未使用的办法。由于 ES6 模块现在是 TC39 标准,Oxlint 不支持此功能。
示例
此规则错误代码的示例
javascript
/*eslint no-unused-vars: "error"*/
/*global some_unused_var*/
// It checks variables you have defined as global
some_unused_var = 42;
var x;
// Write-only variables are not considered as used.
var y = 10;
y = 5;
// A read for a modification of itself is not considered as used.
var z = 0;
z = z + 1;
// By default, unused arguments cause warnings.
(function (foo) {
return 5;
})();
// Unused recursive functions also cause warnings.
function fact(n) {
if (n < 2) return 1;
return n * fact(n - 1);
}
// When a function definition destructures an array, unused entries from
// the array also cause warnings.
function getY([x, y]) {
return y;
}
ts
type A = Array<A>;
enum Color {
Red,
Green,
Blue,
}
此规则正确代码的示例
js
/*eslint no-unused-vars: "error"*/
var x = 10;
alert(x);
// foo is considered used here
myFunc(
function foo() {
// ...
}.bind(this),
);
(function (foo) {
return foo;
})();
var myFunc;
myFunc = setTimeout(function () {
// myFunc is considered used
myFunc();
}, 50);
// Only the second argument from the destructured array is used.
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 */
// Not respected, use ES6 modules instead.
var global_var = 42;