Skip to content

Any / Unknown

TypeScript에서 anyunknown은 모두 어떤 타입의 값이든 받을 수 있는 타입이다.
하지만 값을 사용할 때의 안전성에서 큰 차이가 있다.

  • 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(); // Error

TypeScript는 value가 문자열인지, 숫자인지, 객체인지 확신할 수 없기 때문에 바로 메서드를 사용하지 못하게 한다. 따라서 사용하기 전에 타입을 먼저 확인해야 한다.


ts
let value: unknown = 'hello';

if (typeof value === 'string') {
  value.toUpperCase(); // 가능
}

typeof value === 'string' 조건문 안에서는 TypeScript가 value를 string 타입으로 판단한다. 그래서 문자열 메서드인 toUpperCase()를 사용할 수 있다.


🧩 Any와 Unknown의 차이 요약

타입할당바로 사용타입 안전성
any모든 값 가능가능낮음
unknown모든 값 가능불가능, 타입 확인 필요높음
  • anyunknown은 모두 어떤 타입의 값이든 받을 수 있다.
  • any는 타입 검사를 우회하기 때문에 잘못된 사용도 막아주지 못한다.
  • unknown은 값을 사용하기 전에 타입 확인이 필요하다.
  • 타입을 확신할 수 없는 값은 any보다 unknown을 사용하는 것이 더 안전하다.