본문 바로가기
개발/TypeScript

타입 단언할때 unknown이 나타나는 이유

by 안뇽! 2023. 9. 2.
반응형

타입 단언할때 unknown이 나타나는 이유

타입 단언

가끔씩은 개발자의 타입판단이 타입스크립트의 타입추론보다 정확할때가 있다. 그럴때는 as를 통해 타입 단언을 하는 것이 낫다.

예를 둘어, DOM 엘리먼트에 대해서는 타입스크립트보다 개발자가 더 정확히 알고 있다. 타입스크립트는 DOM에 접근할 수 없기 때문에 엘리먼트에 대해 정확히 알지 못한다.

 

타입 단언은 컴파일중에 제거되므로, 타입체커가 되지 않는다. 따라서 개발자의 판단이 틀렸다면 런타임중에 에러가 발생할것이다. 때문에 확신할 수 있을때만 타입단언을 사용해야 한다.

타입 단언이 위험하다고 판단되는 경우

타입단언으로 임의 타입간에 항상 변환이 가능한 것은 아니다. 한쪽이 다른쪽의 서브타입일 경우에 타입 단언이 가능하다.

예를 들어 다음과 같은 경우에는 문제가 없다.

const div = document.querySelector("div"); // HTMLDivElement | null
const body = document.body; // HTMLElement
// HTMLElement는 HTMLDivElement의 서브타입이기 때문에 타입단언에 문제가 없다.
const el = body as HTMLDivElement;

하지만 Dog와 HTMLElement는 한쪽이 다른쪽의 서브타입이 아니므로 타입단언이 불가능하다.

interface Dog {
  bark(): void;
}

const body = document.body;
const el = body as Dog;

unknown

모든 타입은 unknown의 서브타입이기 때문에 unknown이 포함된 단언문은 항상 동작한다.

이 오류를 해결하려면 unknown 타입을 사용하면 된다.

모든 타입은 unknown의 서브타입이기 때문에 unknown이 포함된 단언문은 항상 동작한다. unknown 단언은 임의의 타입 간에 변환을 가능케 하지만, unknown을 사용한 이상 적어도 무언가 위험한 동작을 하고 있다는 것을 염두해야 한다.

const div = document.querySelector("div");
const body = document.body;
// unknown을 이용하면 무언가 위험할 확률이 높다.
const el = body as unknown as Dog;

 

반응형