TypeScript는 강력한 타입 시스템을 제공하여 코드의 타입 안정성을 보장한다. 그중에서도 any
와 unknown
타입은 '타입을 모르는' 상태를 표현할 때 사용된다. 하지만 두 타입은 중요한 차이점을 가지고 있으며, 이를 올바르게 이해하고 사용하는 것이 중요하다. 이번 글에서는 any
와 unknown
의 차이점을 살펴보겠다.
any
타입은 TypeScript에서 '모든 타입'을 의미
어떤 타입이든 될 수 있으며, 해당 값에 대해 아무런 제약 없이 자유롭게 사용 가능
any
를 사용하면 컴파일러가 타입 검사를 하지 않기 때문에 타입 안정성을 잃음
let value: any;
value = 42;
value = "hello";
value = true;
// 위에 value는 전부 any 타입
// 타입 검사 없이 사용 가능
console.log(value.toUpperCase()); // 런타임 에러가 발생할 수 있음
// Property 'toUpperCase' does not exist on type 'boolean' 에러 발생
위 코드에서 보듯이, any
는 매우 자유롭게 사용할 수 있지만, 그만큼 실수를 감지하지 못하고 런타임에서 에러를 일으킬 수 있다. any
는 매우 편리하지만, 타입 안정성을 희생하는 결과를 초래할 수 있다.
unknown
타입은 any
와 유사하게 '모든 타입이 될 수 있다'는 의미
중요한 차이점은, unknown
타입으로 선언된 값은 타입이 확정되지 않으면 사용이 제한된다는 점
이를 통해 타입 안전성을 보장
let value: unknown;
value = 42;
value = "hello";
// 바로 사용 불가
// console.log(value.toUpperCase()); // 에러
'value' is of type 'unknown'.(18046) 에러 메시지
// 타입 검사를 통해 안전하게 사용 가능
if (typeof value === "string") {
console.log(value.toUpperCase()); // 정상 동작
}
unknown
은 항상 타입 검사를 통해 값의 타입을 확정해야만 사용할 수 있기 때문에, any
보다 안전한 방식으로 값을 다룰 수 있다. 이는 unknown
타입의 주요 장점으로, 런타임 에러를 줄이는 데 도움이 된다.
특징 | any | unknown |
---|---|---|
타입 안전성 | 낮음 | 높음 |
사용 가능 여부 | 즉시 사용 가능 | 타입 검사 후 사용 가능 |
컴파일러 타입 검사 | 없음 | 타입 검사 필요 |
사용 목적 | 타입 안정성보다는 자유로운 사용이 필요할 때 | 안전한 타입 검사가 필요한 경우 |
어떤 타입을 선택해야 할까?
any
는 매우 유연하지만, 타입 안정성을 희생
정말로 타입을 모르는 경우에만 사용하고, 가능하면 unknown
타입을 사용
unknown
타입은 타입 검사를 강제하므로, 타입 안전성을 유지하면서 유연한 코드를 작성 가능
결론적으로, 타입 안정성이 중요한 코드에서는 unknown
을 사용하는 것이 더 좋은 선택이 될 수 있다. any는 꼭 필요한 상황에서만 사용하는 것이 좋다.