Any / Unknown
TypeScript에서 any와 unknown은 모두 어떤 타입의 값이든 받을 수 있는 타입이다.
하지만 값을 사용할 때의 안전성에서 큰 차이가 있다.
any: 타입 검사를 사실상 하지 않는다.unknown: 어떤 값이든 받을 수 있지만, 사용하기 전에 타입 확인이 필요하다.
Any
any는 모든 타입의 값을 허용하는 타입이다.any로 선언된 값은 TypeScript의 타입 검사를 거의 받지 않는다.
ts
let anyValue: any = 'hello';
anyValue = 123;
anyValue = true;
anyValue = () => {};
anyValue = { name: 'Binny' };any는 어떤 값이든 할당할 수 있고, 어떤 방식으로든 사용할 수 있다.
ts
let flexibleValue: any = 'hello';
flexibleValue.toUpperCase(); // 가능
flexibleValue = 123;
flexibleValue.toFixed(); // 가능
flexibleValue = { name: 'Binny' };
flexibleValue.toUpperCase(); // 컴파일 에러는 없지만, 런타임 에러 발생any는 타입 검사를 우회하기 때문에 편리하지만, 잘못된 메서드나 속성 접근도 TypeScript가 막아주지 못한다. 그래서 런타임 에러가 발생할 수 있다.
ts
let num: number = 10;
let value: any = 'hello';
num = value; // 가능any 타입의 값은 다른 타입의 변수에도 할당할 수 있다.
이처럼 any는 타입 시스템의 검사를 느슨하게 만들기 때문에 필요한 경우에만 제한적으로 사용하는 것이 좋다.
Unknown
unknown도 어떤 타입의 값이든 받을 수 있는 타입이다.
하지만 any와 달리, 값을 사용하기 전에 타입을 확인해야 한다.
ts
let unknownValue: unknown = 'hello';
unknownValue = 123;
unknownValue = true;
unknownValue = { name: 'Binny' };여기까지만 보면 any와 비슷해 보인다.
하지만 unknown 타입의 값은 바로 사용할 수 없다.
ts
let unknownValue: unknown = 'hello';
unknownValue.toUpperCase(); // ErrorTypeScript는 value가 문자열인지, 숫자인지, 객체인지 확신할 수 없기 때문에 바로 메서드를 사용하지 못하게 한다. 따라서 사용하기 전에 타입을 먼저 확인해야 한다.
ts
let value: unknown = 'hello';
if (typeof value === 'string') {
value.toUpperCase(); // 가능
}typeof value === 'string' 조건문 안에서는 TypeScript가 value를 string 타입으로 판단한다. 그래서 문자열 메서드인 toUpperCase()를 사용할 수 있다.
🧩 Any와 Unknown의 차이 요약
| 타입 | 할당 | 바로 사용 | 타입 안전성 |
|---|---|---|---|
any | 모든 값 가능 | 가능 | 낮음 |
unknown | 모든 값 가능 | 불가능, 타입 확인 필요 | 높음 |
any와unknown은 모두 어떤 타입의 값이든 받을 수 있다.any는 타입 검사를 우회하기 때문에 잘못된 사용도 막아주지 못한다.unknown은 값을 사용하기 전에 타입 확인이 필요하다.- 타입을 확신할 수 없는 값은
any보다unknown을 사용하는 것이 더 안전하다.