Unknown vs. Any
3 min read

Unknown vs. Any

typescript의 unknown과 any에는 어떤 차이가 있는지 알아본다.


서론

Typescript에서 any는 마치 마법의 타입처럼 쓰이는 경우가 있다. 말 그래도 any타입에는 어떤 것이든 할당할 수 있기 때문이다. 때문에 어떤 개발자들은 종종 타입 명시를 any로 처리해버리는 경우가 있다. 이는 typescript의 장점을 버리는 일로, 당연히 이는 지양해야 하는 일이다.

하지만 우리는 이따금 any 타입이 필요한 순간이 온다. 어떤 타입이 들어올지 정확히 알 수 없는 상황이 그것이다. 하지만, 이런 경우에도 unknown을 사용하는 선택지를 고를 수 있다.

Any

anynever 타입을 제외한 어떤 타입에도 할당 가능한 타입이다. 그리고 거꾸로 any에 할당하는 것은 모든 타입이 가능하다.

let value:any = undefined;
value = 1;
value = 'hi';
value = [1,2,3];

위와 같이, any타입으로 선언된 변수에는 어떤 값이든 들어올 수 있다. 하지만 타입 체크를 할 수 없기에 추적이 어려워지고 관리 또한 어려워진다. 애초에 정적 타입을 위해 typescript를 사용하는 만큼, 최대한 지양해야 하는 타입이다.

Unknown

unknown타입은 어떤 타입에도 할당할 수 없다. 그러나 거꾸로 어떤 타입도 unknown타입에 할당 될 수 있다.

let value:unknown = undefined;
value = 1;
value = 'hi';
value = [1,2,3];

하지만 중요한 차이점이 있는데, 어떤 값을 집어넣어도 value의 타입은 unknown이라는 사실이다. 때문에

let value:unknown = 1;
value += 1; // error!

위와 같이 사용할 수 없다! value는 unknown이기 때문이다. 따라서 위와 같은 코드를 작성하고 싶다면

let value:unknown = 1;
if(typeof value === 'number'){
	value += 1; // good
}

이런 식으로 type narrowing 이나 type assertion이 선행되어야 한다. unknown자체로는 어떤 작업도 할 수 없기에, 더 안전하다고 볼 수 있다.

결론

사실 실제 개발 환경에서는 anyunknown둘 다 잘 쓰이지 않는다. 그러나 만약 any를 써야 하는 상황에서는 가급적 unknown을 쓰도록 하자.

참고 자료

typescript - unknown typescript - type compatibility