any와 unknown

woodstock·2023년 12월 9일
1
post-thumbnail

any와 unknown

any 타입

any타입은 타입스크립트에서만 제공되는 특별한 타입으로 타입 검사를 받지 않는다.

위와같이 변수 anyVar를 number 타입의 값 10으로 초기화한 후 string 타입의 값 "hello"를 저장하면 위와같이 오류가 발생한다.

타입스크립트에서는 변수의 타입이 변수를 초기화할 때 초기화하는 값을 기준으로 추론하기 때문이다.

이때, 아래와같이 any타입을 사용하면 오류가 발생하지 않는다.

any는 최대한 사용하지 말자

하지만, 위 코드를 컴파일하거나 ts-node로 실행해보면 다음과 같은 런타임 오류가 발생한다.

마지막에 anyVar에 함수를 할당했는데 toUpperCase()라는 문자열 메서드를 호출하려고 하니 오류가 발생하는 것이다.

이처럼 any타입은 모든 타입스크립트의 문법과 규칙으로부터 자유롭지만, 사실상 타입 검사를 받지 않으므로 가급적 사용하지 않는 것이 좋다.

unknown 타입

unknown타입은 any와 비슷하지만 보다 안전한 타입으로, 다음과 같이 어떤 타입의 값이든 다 저장할 수 있다.

let unknownVar: unknown;

unknownVar = "";
unknownVar = 1;
unknownVar = () => {};

하지만, 반대로 다른 타입의 변수에 unknown타입의 값을 저장할 수는 없다.

또한 어떤 연산에도 참여할 수 없으며, 메서드도 사용할 수가 없다.


unknown타입의 값을 사용하려면 다음과 같이 조건문을 이용해 이 값이 number 타입의 값임을 보장해줘야 한다.
if (typeof unknownVar === "number") {
  // 이 조건이 참이된다면 unknownVar는 number 타입으로 볼 수 있음
  num = unknownVar;
}

이처럼 조건문을 이용해 특정 값이 특정 타입임을 보장할 수 있게 되면 해당 값의 타입이 자동으로 바뀌게 되는데 이를 타입 좁히기 또는 타입 정제라고 한다.

profile
해내는 사람

0개의 댓글