
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는 꼭 필요한 상황에서만 사용하는 것이 좋다.