Typescript에서 Any를 쓰면 안되는 이유
타입스크립트는 코드를 작성할 때 자바스크립트와는 달리 올바른 타입을 사용하도록 강제한다.
그런데, 타입스크립트에는 any
라는 특별한 타입이 존재한다. any
를 사용하면 변수는 모든 타입의 데이터를 가질 수 있다. 가령 any
타입을 사용한 변수는 string도, number도 될 수 있는 것이다.
그런데 개발 커뮤니티 등에서는 any
를 사용하지 말아야 한다고 주장하는 사람들이 많았다.
쓰라고 만들어 놓은 타입인
any
를 왜 사용하면 안될까?
타입스크립트의 본질적인 목적을 흐리기 때문
any
는 타입스크립트의 강력한 타입 체킹 기능을 손쉽게 무효화시킨다. 자바스크립트에서 이게 불편해서 기껏 타입스크립트를 만들어놨더니 굳이 타입 체킹 기능을 해제하며 사용할 바엔 타입스크립트를 사용할 이유가 없다는 것이 크다.
any
를 사용함으로써, 이슈를 트레이싱하고 디버그하기 어렵다는 기존 자바스크립트의 문제점을 고스란히 가져가게 되는 것이다. 프로덕션 환경에서 예기치 못하게 발생한 문제라면? 훨씬 더 큰 문제가 될 수 있다.
any
가 등장하게 된 배경
그럼 이렇게 언어의 본질을 흐리는
any
타입은 왜 생겼을까? 애초에 안 만들면 문제가 되지 않잖아.
타입스크립트는 본질적으로 자바스크립트의 불편한 점을 개선하고 대체하기 위해 탄생한 언어이다. 때문에 자바스크립트가 동작하는 환경의 특징을 고려해야 한다.
자바스크립트는 웹 페이지를 동적으로 조작하기 위해 생겨난 언어이다. 때문에 접근이 기본적으로 제한되는 서버 환경과 비교하여 수많은 raw 데이터를 접하고 다뤄야 할 일이 빈번하다.
내 생각에는 var
가 그렇다. 그 불편함과 side effect는 제쳐두고라도 자바스크립트의 유연함을 가장 잘 나타낼 수 있는 문법이라고 생각한다.
보다 다양한 데이터를 다루기 위해서, typing을 강제하는 타입스크립트에서도 any
타입이 생겨났다고 생각한다.
any
가 필요한 예시
레거시 자바스크립트 코드와 데이터를 서로 호환할 일이 있는 환경에서는 any
를 통해 var
로 선언되어 있는 데이터 형식을 맞춰주어야 할 필요가 있을 것이다.
결론
- 올바른 타입을 사용하자.
- 들어온 데이터의 타입을 모르는 경우,
unknown
타입을 사용하자.
unknown
타입이란?
unknown
타입은 변수에 모든 타입을 매칭시킬 수 있지만, unknown
타입을 가지는 변수를 타입을 가지는 다른 변수에 할당할 수는 없다.
unknown
타입은 any
의 type-safe한 버전이다.
unknown
타입에는 모든 타입을 할당할 수 있다.- 하지만
unknown
타입은 그 어떠한 변수에도 할당될 수 없다. - 같은 맥락에서
unknown
타입의 변수를 어떤 타입으로 특정하기 전까지는 어떠한 작업도 허용되지 않는다.
개인적으로는 값에 대한 체크를 개발자가 명시적으로 하게 해준다는 점에서 unknown
이 마치 자바의 Optional
과 비슷한 느낌을 받았다.