eslint/no-unused-vars 정확성
작동 방식
코드 내에서 사용되지 않는 변수 선언, 임포트 또는 타입 선언을 허용하지 않습니다.
왜 문제가 될까요?
코드 내 어디에서도 사용되지 않는 변수를 선언하는 것은 부족한 리팩터링으로 인해 발생한 오류일 가능성이 큽니다. 이러한 변수는 코드 공간을 차지하고 읽는 사람에게 혼란을 줄 수 있습니다.
// `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) - 타입스크립트의
typeof연산자의 피연산자로 사용되거나(const bar: typeof foo = 4)
변수가 단지 선언되었을 뿐(var foo = 5)이거나 할당되었을 뿐(foo = 7)이라면, 그 변수는 사용되지 않은 것으로 간주됩니다.
타입
이 규칙은 타입스크립트의 타입, 인터페이스, 열거형 및 네임스페이스에 대해 완전한 지원을 제공합니다.
타입이나 인터페이스 Foo는 다음 중 하나에 사용되는 경우 사용된 것으로 간주됩니다:
- 다른 타입이나 인터페이스 정의에서 사용됨
- 타입 애너테이션 또는 함수 시그니처의 일부로 사용됨
- 캐스트 또는
satisfies표현식에서 사용됨
타입이나 인터페이스가 자신 정의 내에서만 사용된다면(예: type Foo = Array<Foo>), 사용되지 않은 것으로 간주됩니다.
열거형과 네임스페이스는 변수, 클래스, 함수 등과 동일하게 처리됩니다.
무시 대상 파일
이 규칙은 .d.ts, .astro, .svelte, .vue 파일을 완전히 무시합니다. .d.ts 파일에서 선언된 변수, 클래스, 인터페이스, 타입은 일반적으로 다른 파일에서 사용되며, 해당 파일은 Oxlint이 검사하지 않습니다. Oxlint이 템플릿 구문을 해석할 수 없기 때문에, 이 규칙은 Vue / Svelte / Astro 파일 내에서 변수가 사용되었는지 여부를 판단할 수 없습니다.
내보낸 항목
원래 ESLint 규칙은 /* exported variableName */ 주석을 통해 다른 스크립트에서 변수가 사용되고 있음을 표시하고, 이를 사용되지 않은 것으로 보지 않도록 하는 방법을 인정합니다. 하지만 이제 ES 모듈이 TC39 표준이 되었으므로, Oxlint은 이 기능을 지원하지 않습니다.
예시
이 규칙에 대해 잘못된 코드의 예시:
/* 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;
}type A = Array<A>;
enum Color {
Red,
Green,
Blue,
}이 규칙에 대해 올바른 코드의 예시:
/* 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);
// 배열 분해에서 두 번째 매개변수만 사용됩니다.
function getY([, y]) {
return y;
}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 */ 작업에 대해 잘못된 코드의 예시:
/* exported global_var */
// 무시됩니다. 대신 ES 모듈을 사용하세요.
var global_var = 42;구성
이 규칙은 다음 속성을 가진 구성 객체를 수락합니다:
args
type: "after-used" | "all" | "none"
기본값: "after-used"
사용되지 않는 매개변수의 검사를 제어합니다.
"after-used"
마지막으로 사용된 매개변수 앞에 위치한 사용되지 않는 위치적 매개변수는 검사하지 않지만, 모든 이름이 지정된 매개변수와 마지막으로 사용된 매개변수 이후의 모든 위치적 매개변수는 검사됩니다.
"all"
모든 이름이 지정된 매개변수는 사용되어야 합니다.
"none"
매개변수를 검사하지 않습니다.
argsIgnorePattern
사용되지 않는 매개변수에 대한 이 규칙의 예외를 지정합니다. 이 패턴과 일치하는 이름의 매개변수는 무시됩니다.
기본값은 ^_이며, 옵션이 객체로 구성될 경우 None으로 기본 설정됩니다. 참고로 이 동작은 ESLint 및 TypeScript-ESLint와 다르며, 이 둘은 항상 기본 패턴을 제공하지 않습니다.
예시
패턴이 ^_일 때 이 옵션에 대해 올바른 코드의 예시:
function foo(_a, b) {
console.log(b);
}
foo(1, 2);caughtErrors
type: "all" | "none"
catch 블록 검증에 사용됩니다.
"all"
모든 이름이 지정된 매개변수는 사용되어야 합니다.
"none"
오류 객체 검사를 하지 않습니다.
caughtErrorsIgnorePattern
catch 블록 내에서 잡힌 오류에 대한 이 규칙의 예외를 지정합니다. catch 블록 내에서 선언된 변수의 이름이 이 패턴과 일치하면 무시됩니다.
예시
패턴이 ^ignore일 때 올바른 코드의 예시:
try {
// ...
} catch (ignoreErr) {
console.error("Error caught in catch block");
}destructuredArrayIgnorePattern
이 옵션은 구조 분해 패턴 내에서 사용 여부 검사를 하지 않을 예외를 지정합니다. 배열 구조 분해 내에서 선언된 변수 중 이름이 이 패턴과 일치하면 무시됩니다.
기본값은 설정되지 않습니다.
예시
패턴이 ^_일 때 이 옵션에 대해 올바른 코드의 예시:
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
기본값: false
ignoreClassWithStaticInitBlock 옵션은 부울 값입니다. 정적 초기화 블록은 클래스 정의 평가 중 정적 변수를 초기화하고 코드를 실행할 수 있게 해줍니다. 즉, 클래스 인스턴스를 생성하지 않고도 정적 블록 코드가 실행됩니다. 이 옵션이 true로 설정되면 정적 초기화 블록을 포함하는 클래스는 무시됩니다.
예시
{ "ignoreClassWithStaticInitBlock": true } 옵션에 대해 잘못된 코드의 예시:
/* no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/
class Foo {
static myProperty = "some string";
static mymethod() {
return "some string";
}
}
class Bar {
static {
let baz; // 사용되지 않는 변수
}
}{ "ignoreClassWithStaticInitBlock": true } 옵션에 대해 올바른 코드의 예시:
/* no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/
class Foo {
static {
let bar = "some string";
console.log(bar);
}
}ignoreRestSiblings
type: boolean
기본값: false
나머지 속성(스프레드 속성)을 사용하면 객체에서 속성을 생략할 수 있지만, 기본적으로 형제 속성들은 "사용되지 않음"으로 표시됩니다. 이 옵션이 활성화되면 나머지 속성의 형제 속성은 무시됩니다.
예시
이 옵션이 true로 설정되었을 때 올바른 코드의 예시:
// 'foo'와 'bar'는 나머지 속성 형제로 인해 무시되었습니다.
var { foo, ...coords } = data;
var bar;
({ bar, ...coords } = data);ignoreUsingDeclarations
type: boolean
기본값: false
true로 설정되면, using 또는 await using 선언으로 선언된 변수조차 사용되지 않았더라도 무시됩니다.
이는 명시적 리소스 관리 제안을 통해 반드시 해제되어야 하는 리소스를 다룰 때 유용하며, 주된 목적은 리소스의 해제 사이드 이펙트이지 리소스 자체 사용이 아닙니다.
예시
{ "ignoreUsingDeclarations": true } 옵션에 대해 올바른 코드의 예시:
/* no-unused-vars: ["error", { "ignoreUsingDeclarations": true }]*/
using resource = getResource();
await using anotherResource = getAnotherResource();reportUsedIgnorePattern
type: boolean
기본값: false
reportUsedIgnorePattern 옵션은 부울 값입니다. 이 옵션을 사용하면, varsIgnorePattern, argsIgnorePattern, caughtErrorsIgnorePattern, 또는 destructuredArrayIgnorePattern 중 하나의 유효한 무시 패턴과 일치하는 변수가 실제로 사용되었을 경우에도 경고를 보고합니다.
예시
{ "reportUsedIgnorePattern": true } 옵션에 대해 잘못된 코드의 예시:
/* no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/
var firstVarIgnored = 1;
var secondVar = 2;
console.log(firstVarIgnored, secondVar);{ "reportUsedIgnorePattern": true } 옵션에 대해 올바른 코드의 예시:
/* no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/
var firstVar = 1;
var secondVar = 2;
console.log(firstVar, secondVar);reportVarsOnlyUsedAsTypes
type: boolean
기본값: false
reportVarsOnlyUsedAsTypes 옵션은 부울 값입니다.
true로 설정되면, 타입으로만 사용되는 변수도 경고 대상이 됩니다.
예시
{ "reportVarsOnlyUsedAsTypes": true } 옵션에 대해 잘못된 코드의 예시:
/* no-unused-vars: ["error", { "reportVarsOnlyUsedAsTypes": true }] */
const myNumber: number = 4;
export type MyNumber = typeof myNumber{ "reportVarsOnlyUsedAsTypes": true } 옵션에 대해 올바른 코드의 예시:
export type MyNumber = number;참고: { "reportVarsOnlyUsedAsTypes": false }인 경우에도, 자신 안에서만 타입으로 사용되는 경우는 여전히 경고가 표시됩니다:
function foo(): typeof foo {}vars
type: "all" | "local"
기본값: "all"
글로벌 범위에서 변수 사용 여부를 어떻게 검사할지 제어합니다.
"all"
글로벌 범위의 변수를 포함하여 모든 변수의 사용 여부를 검사합니다.
"local"
지역적으로 선언된 변수는 사용되었는지 검사하지만, 글로벌 변수는 사용되지 않아도 허용합니다.
varsIgnorePattern
사용되지 않는 변수에 대한 이 규칙의 예외를 지정합니다. 이 패턴과 일치하는 이름의 변수는 무시됩니다.
기본값은 ^_이며, 옵션이 객체로 구성될 경우 None으로 기본 설정됩니다. 참고로 이 동작은 ESLint 및 TypeScript-ESLint와 다르며, 이 둘은 항상 기본 패턴을 제공하지 않습니다.
예시
패턴이 ^_일 때 이 옵션에 대해 올바른 코드의 예시:
var _a = 10;
var b = 10;
console.log(b);사용 방법
이 규칙을 활성화하려면 구성 파일 또는 커맨드라인에서 다음과 같이 사용할 수 있습니다:
{
"rules": {
"no-unused-vars": "error"
}
}oxlint --deny no-unused-vars