- Published on
Effective TypeScript item5
✅ Item 5: any 타입 지양하기
1️⃣ any 타입에는 타입 안정성이 없다
any는 모든 타입과 호환되며, 타입 안정성(type safety) 을 제공하지 않는다.
function greet(user: any) {
console.log(user.toUpperCase());
}
greet('hello'); // ✅ 정상 동작
greet(123); // ❌ 런타임 에러 (toUpperCase is not a function)
타입 검사가 비활성화되어 런타임 오류로 이어질 수 있다.
2️⃣ any는 함수 시그니처를 무시해버린다
함수의 입력 타입이 any이면, 실제 어떤 값이 들어오든 타입 검사를 통과함.
function add(x: any, y: any) {
return x + y;
}
add(1, 2); // ✅ 3
add('a', 'b'); // ✅ "ab"
add({}, []); // ✅ "[object Object]"
모든 조합이 허용되므로 의도와 다른 호출도 막을 수 없다.
3️⃣ any 타입에는 언어 서비스가 적용되지 않는다
any는 IDE의 자동완성, 타입 추론, 문서 확인 등의 언어 서비스를 사용할 수 없다.
let config: any = getConfig();
config. // ← 자동완성 없음
협업과 유지보수 시 생산성 하락으로 이어짐
4️⃣ any는 코드 리팩터링 시 버그를 감춘다
변수나 함수가 any 타입이면, 코드 변경 시 오류가 감지되지 않아 런타임 에러를 유발한다.
function fetchUser(): any {
return { name: 'Boohi', age: 27 };
}
const user = fetchUser();
console.log(user.fullName); // ❌ 존재하지 않는 속성도 허용됨
구조 변경 시에도 타입 오류가 발생하지 않기 때문에, 버그가 숨어 있게 됨
5️⃣ any는 타입 설계를 감춰버린다
any를 사용하면, 그 값이 어떤 구조를 가지는지 파악하기 어려워짐.
function render(data: any) {
// data의 구조가 불명확하여 문서화도 어려움
console.log(data.title);
}
타입은 코드의 설계도입니다.
any는 그 설계도를 숨겨버린다.
6️⃣ any는 타입 시스템의 신뢰도를 떨어뜨린다
코드베이스의 일부가 any로 작성되면, 타입스크립트가 제공하는 정적 분석 능력을 신뢰할 수 없게 됩니다.
function process(value: any) {
return value.id + 1;
}
const result = process('abc'); // ❌ 컴파일은 되지만, 런타임 오류
타입 시스템이 있어도 실제 안정성은 확보되지 않음 → 팀원 간 신뢰도 저하
✅ 결론
any는 빠른 개발에는 도움이 되지만, 장기적인 유지보수와 팀 협업에는 큰 리스크를 안고 있다.unknown, 명시적 타입, 타입 가드 등을 적극 활용해 타입 안전성과 가독성을 유지하는 것이 좋다.