Contents

typescript - any와 unknown의 차이

Contents

 
 

typescript로 코딩을 하다가 어떤 타입인지 정의 내리기 힘든 상황에서 주로 any 를 사용한다.
물론 typescript의 성격상 any는 지양하는 것이 좋다.
오류를 검증하고 확인하려는 특성으로 엄격한 타입을 지정하려는 typescript에서 어떤 타입이나 가능하다는 성격의 any는 어쩌면 존재 자체가 모순인 타입이기도 하다.
 

하지만코딩을 하다보면 아직은 타입을 정하기 전인 상황이거나, 도저히 타입을 알 수 없거나 추론할 수 없을 때, (또는 typescript 초급자일 때 ;;) 가끔 사용하게 되는 것이 또 any 타입이다.
 

하지만 이제부터 이럴때 any보다는 unknown을 사용하자.
 

이 둘의 정의는 마치 undefinednull의 관계와도 비슷하다.
 

얼핏 비슷해보이지만 확실하게 다른 정의이다.
 

any는 어떤 타입도 상관 없으며 어떤 식으로 내보내져도, 그리고 내보내진 타입을 어떤 곳에서 받아들이게 되더라도 상관이 없는…
typescript의 엄격모드로부터 해방시켜주는 타입의 역할을 한다.
 

unknownany와는 달리 어떤 타입인지 모르겠다는 의미이다.
즉, 단어 해석 그대로 any가 ‘아무거나’라면, unknown은 ‘아직 모름’이라 뜻!
 

차이는 다음과 같다.
 

let a: unknown = 3;  
let b: any = 3;  
let c: number = 3;
  
const unknownTest = a + c;  
// ERROR - TS2365: Operator '+' cannot be applied to types 'unknown' and '3'.
  
const anyTest = b + c;
// success!!

 

any로 지정한 변수가 다른 타입인 숫자와 연산이 가능한 반면,
unknown으로 지정한 변수는 숫자와 연산이 불가능하다.
 

즉, unknown은 어떤 타입이라도 적용할 수 있지만,
타입이 정의내려진 다른 변수 c와 함께 적용시 c의 타입에서 타입 엄격모드가 발동하며 에러를 낸다.

 

any의 경우에는 이러한 타입 엄격모드를 마치 꺼놓은듯 typescript의 무장을 해제시키고 코드 진행이 가능하다.  

따라서 디버깅을 하며 파일의 오류나 코드 흐름을 쫓을때, any보다는 unknown을 사용하는 것이 타입흐름의 통제에 있어 훨씬 낫다는 판단이 든다.