Photo by Amador Loureiro on Unsplash

타입스크립트: any와 unknown

민동준

--

typescript는 static testing 도구다. typescript(TSC)가 내가 쓰는 코드를 type-checking하며 디버깅을 해주기 때문에 많은 시간을 아낄 수 있다.

하지만 우리가 개발을 하면서 코드가 더 복잡해지고 동적으로 변하면서 type에 any를 쓰고 싶은 유혹은 하루에도 백번씩 일어난다. any를 쓰면 안되는걸 알면서도..

그렇다면 도대체 any는 왜 만든것이며, 그를 대체할만한 unknown은 무엇인지 ‘간단하게' 알아보자.

1. any

any는 typescript에서 가불기같은 존재다. 동물, 식물, 열매같은 이런 좁혀진 type 따위가 아니다. ‘온 우주의 모든것'같은 type이기 때문에 코드를 쓰다가 타입을 모르겠으면 ‘any’를 쓰고 있는 내 자신을 발견 할 수 있을 것이다.

그런 이유로 any를 사용하게 되면 typescript를 쓰는 이유가 없어지므로 로또가 되어서 내일부터 개발을 하지 않아도 된다면 any를 쓰지 말자.

하지만 (드물겠지만) 사용을 해도 되는 예시가 있다:

let a: any = 666         //any
let b: any = ['danger'] //any
let c = a + b //any

그러니까 설명하자면 굳이 ‘파맛첵스'를 만들고 싶다면 typescript도 말리지는 않겠다는 뜻이다. 굳이 배열과 숫자를 합치겠다면 명시를 하고 합칠 수 있다.

‘오 이렇게 해도 되는구나'보다는 ‘저렇게 쓸 일이 아니면 any는 쓰지말자'로 받아들이는게 더 좋을 것 같다.

2. unknown

unknown이 사실 any를 대체할 수 있고 훨씬 더 유용하게 사용 가능한 type이다. unknown은 말 그대로 ‘아모른직다'이다.

사실 any의 유혹이 가장 큰 이유는 ‘아직 모르겠는데..’이다. 다만 any는 ‘모든 타입이 가능하다'이고 unknown은 ‘아직 모르니까 나중에 다시 돌아오겠다'이므로 목적과 기능에 있어서 큰 차이가 있다.

any는 타입스크립트가 넘겨버리지만 unknown은 짚고 넘어가도록 tsc가 작동한다.

let a: unknown = 30  //unknown
let b = a === 123. //boolean
let c = a + 10. //에러 ts2571: 객체의 타입이 'unknown'입니다

이렇게 되므로 typescript의 기능과 목적이 살아있게 된다.

추가로 자바스크립트의 typeof, instance of 로 정제가 가능하다.

if (typeof a === 'number') {
let d = a + 10 //number
}

이렇게 unknown이었던 a를 typeof로 타입을 확인시킴으로써 정제시킬 수 있다.

참조: https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=240515993

--

--

민동준

저는 영화와 책, 커피와 맥주, 음악과 달리기를 좋아합니다.