recoen.

(번역) 타입스크립트에서 any 대신 unknown을 사용해야하는 이유

본 글은 Typescript: why you should use unknown instead of any 문서를 번역한 글입니다.

우리는 때때로 사전에 미리 타입을 알 수 없는, 그러니까 무엇이든 타입이 될 수 있는 상황을 직면하게 됩니다. TS 버전3 전에는 그런 경우에 any 타입을 사용해야했습니다. 하지만 any를 사용하면 타입 안정성도 잃어버리게 되고, 그 외에 추가적인 단점을 얻게 됩니다.

예시를 살펴볼께요 :

const x: any = {
  a: "a-value",
  b: "b-value"
};

위의 코드에서 x.a에 접근하든, x.b에 접근하든 문제없이 접근이 가능합니다. 하지만 문제는 x.c에 접근하려고하는데도, 어떤 에러도 내뱉지 않는다는 것입니다.

const c = x.c
console.log(c)

보시다시피 이렇게 any를 지정하는 것은 타입스크립트가 포착할 수 있는 많은 오류를 허용하게 되고, 많은 버그의 원인이 됩니다. 왜냐하면 any 타입을 사용하면 타입검사를 해제하는 것이기 때문입니다.

왜 unknown일까요?

unknown 타입은 타입스크립트의 버전3에서 any 타입을 따르는 타입으로 소개되었습니다. unknown 타입이 특정 변수에 할당되게 된다면, 이것이 의미하는바는 해당 변수의 타입은 알려지지 않았다(not known)는 것입니다.

그리고 타입스크립트는 알려진 타입으로 변수에 cast하거나 이것의 타입을 narrow 하지 않는 이상 unknown 타입을 사용할 수 없게 만들었습니다. Type narrowing은 덜 정확한 타입에서 더 정확한 타입으로 옮겨가는 프로세스라고 이해하면 됩니다. 만약 Type narrowing에 대해서 더 알아보고 싶다면 여기를 확인하세요. here.

아래의 예시를 살펴봅시다 :

const x: unknown = 1;
console.log(x*x)

만약에 우리가 type narrowing 없이 위와 같이 unknown을 할당한 x를 제곱하려고 한다면, 타입스크립트는 다음과 같은 에러를 내뱉을 것입니다.

Object is of type 'unknown'.

이런 에러를 고치기 위해서는 x를 제곱해주기 전에 타입가드를 해주어야 합니다.

if(typeof x === "number") {
  console.log(x * x);
}

초기에 사용했던 예제도 마찬가지입니다.

const x: unknown = {
  a: "a-value",
  b: "b-value"
};

any로 지정되어있던 타입을 unknown으로 지정해주고나면, 그 뒤로 해당 프로퍼티에 접근하려고 하면

Object is of type 'unknown'.

이런 에러를 만나게 될 것입니다.

이 상황에서 타입스크립트가 허용하도록 만들어주기 위해서는 이렇게 사용해야합니다.

console.log((x as {a: string; b: string; }).b)

위의 예제에서 볼 수 있듯이, unknown 타입은 타입 캐스팅을 하던, type narrowing을 하던지 둘 중 하나의 방식을 통해 unknown이 할당된 변수의 타입을 결정하도록 강제합니다. 타입스크립트가 결과 타입을 확인할 수 있고 이는 결과적으로 훨씬 더 type-safe한 프로그램으로 이끌어줍니다.

결론

이 아티을에서는 unknown 타입에 대해서 알아보았고, type-safe한 프로그램을 작성하기 위해서 이것을 왜 사용해야하는지도 알아보았습니다. 또한 우리는 any 타입을 왜 지양해야하는지도 알아봤습니다.


나의 서평

이 아티클은 unknown 타입을 공부하기 위해서 읽고 번역했던 글입니다. 이 글 덕분에 명확하게 unknown 타입이 어떤 역할을 해주는지 이해할 수 있었습니다. any 타입이나 unknown 타입은 둘 다, 어떤 유형이든 받을 수 있게 해줍니다. 하지만 차이점이 있습니다. any 타입은 사용부에서조차 관대합니다. any로 지정하고나면, 그 이후에 어떤 값을 할당하든 전혀 신경쓰지 않습니다. 하지만 unknown은 다릅니다. unknown으로 지정하고나면 그 이후로 함부로 이 값을 사용할 수 없습니다. 반드시 타입을 확인해주는 과정(type-casting or type-narrowing)을 거친 다음에 unknown을 사용할 수 있다는 것을 배울 수 있었습니다. 결론적으로 any 보다는 훨씬 더 안전하게 프로그램을 작성할 수 있도록 도와주는 문법인 것 같습니다.

추가적으로 이 아티클을 작성하신 분의 블로그를 보니 타입스크립트와 관련해 다양한 글이 있는 듯 했습니다. 또한 GDE(Google Developer Expert) 인것으로보아 상당히 신뢰도가 높습니다. 궁금하신 분은 해당 블로그를 살펴보셔도 좋을 것 같습니다.