[TypeScript] any vs unknown

calm0_0·2023년 8월 25일
0

TypeScript

목록 보기
1/1

top 타입

top 타입은 타입스크립트에서 가능한 모든 값을 나타내는 타입이다. 모든 값은 top 타입에 할당될 수 있다.

any

any 타입은 모든 타입의 위치에 제공될 수 있다는 점에서 top 타입처럼 작동할 수 있다. any는 일반적으로 console.log의 매개변수와 같이 모든 타입의 데이터를 받아들여야 하는 위치에서 사용한다.

let anyValue: any;
anyValue = "Lucille Ball";  // ok 
anyValue = 123;  // ok

console.log(anyValue);  // ok

하지만 any는 타입스크립트가 해당 값에 대한 타입 검사를 수행하지 않도록 명시적으로 지시한다는 문제점이 있다.

function greetComedian(name: any) {
  // 타입 오류 없음
  console.log(`Announcing ${name.toUpperCase()}!`);
}

greetComedian({ name: "Bea Arthur" });
// Runtime error: name.toUpperCase is not a function

위에서 name.toUpperCase() 호출은 문제가 있지만, any로 선언되어 있어 타입 오류를 보고하지 않는다.

어떤 값이든 될 수 있음을 나타내려면 unknown 타입이 훨씬 안전하다.

unknown

unknown 타입은 모든 객체를 unknown 타입의 위치로 전달할 수 있다는 점에서 any 타입과 유사하다. 차이점은 unknown 타입의 값을 훨씬 더 제한적으로 취급한다는 점이다.

  • 타입스크립트는 unknown 타입 값의 속성에 직접 접근할 수 없다.
  • unknown 타입은 top 타입이 아닌 타입에는 할당할 수 없다.
function greetComedian(name: unknown) {
  console.log(`Announcing ${name.toUpperCase()}!`);
  //
  // Error: Object is of type 'unknown'. 
}

위처럼 unknown 타입 값의 속성에 접근하려고 하면 타입 오류가 발생한다.

위 예제에서 unknown 타입인 name에 접근하려면 istanceof나 typeof 또는 타입 어서션을 사용하여 값의 타입을 제한해야 한다.

function greetComedianSafety(name: unknown) {
  if (typeof value === "string") {
    console.log(`Announcing ${name.toUpperCase()}!`);  // ok
  } else {
    console.log("Well, I'm off.");
  }
}

greetComedianSafety({ name: "Betty White" });
geetComedianSafety({});

unknown 타입의 이러한 제한사항들로 인해 any보다 훨씬 안전한 타입으로 사용된다. 가능하다면 any 대신 unknown을 사용하는 것이 좋다!



Reference
러닝 타입스크립트

profile
공부한 내용들을 정리하는 블로그

0개의 댓글