

Future Engineering
기술의 최전선을 기록합니다.
TypeScript any 린트 에러(no-explicit-any) 근본적으로 해결하기
TypeScript 프로젝트에서 @typescript-eslint/no-explicit-any 린트 에러는 단순 규칙 비활성화로 해결할 문제가 아닙니다. 눈 앞 문제는 해결할 수 있지만, TypeScript를 사용하는 가장 중요한 이유를 위배하게 됩니다.
any 타입은 모든 타입을 허용하는 '만능키' 같지만, 실제로는 버그를 잡을 수 있는 TypeScript 기능을 스스로 포기하게 됩니다.
any를 피해야하는 이유
any를 사용하면 변수에 어떤 타입의 값이든 할당할 수 있고, 어떤 속성이나 메서드에도 에러 없이 접근할 수 있습니다. 이는 당장의 에러는 해결하지만, 실제 코드가 실행될 때 예상하지 못한 타입 버그를 유발하는 주요 원인이 됩니다.
any 사용을 최소화하고 타입 안정성을 높이는 방법
가장 좋은 방법은 구체적입 타입 설정
변수나 데이터 구조를 파악하고, 정확한 타입을 명시하는 것이 좋습니다.
-
기본 타입:
string
,number
,boolean[]
등 -
객체 타입:
interface
또는type
을 사용하여 객체의 구조를 명확히 정의합니다.
// 👎 나쁜 예
function printUser(user: any) {
console.log(user.name, user.age);
}
// 👍 좋은 예
interface User {
name: string;
age: number;
}
function printUser(user: User) {
console.log(user.name, user.age);
}
예측할 수 없다면 unknown 타입을 활용
값의 타입을 전혀 예측할 수 없을 때, any
대신 unknown
을 사용하는 것이 훨씬 안전합니다. unknown
은 변수를 사용하기 전에 타입 가드를 통해 타입을 먼저 확인하도록 강제합니다.
// 👍 좋은 예
function processData(data: unknown) {
if (typeof data === 'string') {
// data가 string임이 확인된 안전한 블록
console.log(data.toUpperCase());
} else if (Array.isArray(data)) {
// data가 배열임이 확인된 안전한 블록
console.log(data.length);
}
}
"any
는 타입스크립트(TypeScript)의 안전 장치를 스스로 해제하는 것과 같아 가능한 한 사용하지 않는 것이 좋습니다. 제네릭(<T>
)을 사용하는 등 any
를 피할 수 있는 방법은 다양하지만, 촉박한 개발 일정에 쫓겨 any
를 남용하며 빠르게 개발하는 경우가 많습니다. 이렇게 쌓여가는 any
타입은 언젠가 기술 부채가 되어 돌아옵니다. 시간을 내어 유지보수한다면 장기적인 비용을 줄일 수 있을 뿐만 아니라, 동료와 자신을 위해 미래 지향적인 개발 습관을 기를 수 있습니다."