Contents

Typescript에서 Any를 쓰면 안되는 이유

타입스크립트는 코드를 작성할 때 자바스크립트와는 달리 올바른 타입을 사용하도록 강제한다.

그런데, 타입스크립트에는 any라는 특별한 타입이 존재한다. any를 사용하면 변수는 모든 타입의 데이터를 가질 수 있다. 가령 any 타입을 사용한 변수는 string도, number도 될 수 있는 것이다.

그런데 개발 커뮤니티 등에서는 any를 사용하지 말아야 한다고 주장하는 사람들이 많았다.

쓰라고 만들어 놓은 타입인 any를 왜 사용하면 안될까?

타입스크립트의 본질적인 목적을 흐리기 때문

any는 타입스크립트의 강력한 타입 체킹 기능을 손쉽게 무효화시킨다. 자바스크립트에서 이게 불편해서 기껏 타입스크립트를 만들어놨더니 굳이 타입 체킹 기능을 해제하며 사용할 바엔 타입스크립트를 사용할 이유가 없다는 것이 크다.

any를 사용함으로써, 이슈를 트레이싱하고 디버그하기 어렵다는 기존 자바스크립트의 문제점을 고스란히 가져가게 되는 것이다. 프로덕션 환경에서 예기치 못하게 발생한 문제라면? 훨씬 더 큰 문제가 될 수 있다.

any가 등장하게 된 배경

그럼 이렇게 언어의 본질을 흐리는 any 타입은 왜 생겼을까? 애초에 안 만들면 문제가 되지 않잖아.

타입스크립트는 본질적으로 자바스크립트의 불편한 점을 개선하고 대체하기 위해 탄생한 언어이다. 때문에 자바스크립트가 동작하는 환경의 특징을 고려해야 한다.

자바스크립트는 웹 페이지를 동적으로 조작하기 위해 생겨난 언어이다. 때문에 접근이 기본적으로 제한되는 서버 환경과 비교하여 수많은 raw 데이터를 접하고 다뤄야 할 일이 빈번하다.

내 생각에는 var가 그렇다. 그 불편함과 side effect는 제쳐두고라도 자바스크립트의 유연함을 가장 잘 나타낼 수 있는 문법이라고 생각한다.

보다 다양한 데이터를 다루기 위해서, typing을 강제하는 타입스크립트에서도 any 타입이 생겨났다고 생각한다.

any가 필요한 예시

레거시 자바스크립트 코드와 데이터를 서로 호환할 일이 있는 환경에서는 any를 통해 var로 선언되어 있는 데이터 형식을 맞춰주어야 할 필요가 있을 것이다.

결론

  1. 올바른 타입을 사용하자.
  2. 들어온 데이터의 타입을 모르는 경우, unknown 타입을 사용하자.

unknown 타입이란?

unknown 타입은 변수에 모든 타입을 매칭시킬 수 있지만, unknown 타입을 가지는 변수를 타입을 가지는 다른 변수에 할당할 수는 없다.

unknown 타입은 any의 type-safe한 버전이다.

  • unknown 타입에는 모든 타입을 할당할 수 있다.
  • 하지만 unknown 타입은 그 어떠한 변수에도 할당될 수 없다.
  • 같은 맥락에서 unknown 타입의 변수를 어떤 타입으로 특정하기 전까지는 어떠한 작업도 허용되지 않는다.

개인적으로는 값에 대한 체크를 개발자가 명시적으로 하게 해준다는 점에서 unknown이 마치 자바의 Optional과 비슷한 느낌을 받았다.