[TypeScript] Any와 Unknown 타입

ttining·2025년 3월 21일

Any 타입

특정 변수의 타입을 확실히 모를 때 사용하는 타입이다.
하지만 any 타입을 사용하면 TypeScript의 타입 검사가 무력화되어 예상치 못한 버그를 초래할 수 있다.

let anyVar: any = 10;
anyVar = "hello";
anyVar = true;
anyVar = {};
anyVar = () => {};

// any 타입은 모든 속성 및 메서드를 사용할 수 있다.
anyVar.toUpperCase();
anyVar.toFixed();

let num: number = 10;
num = anyVar; // any 타입은 다른 타입에도 자유롭게 할당할 수 있다.
  • any 타입을 사용하면 타입 안전성이 보장되지 않으므로, 가능한 사용을 피하는 것이 좋다.


Unknown 타입

unknown 타입은 any와 비슷하지만, 보다 안전한 타입이다.
unknown 타입을 가진 변수는 타입이 확실해지기 전까지 임의의 연산을 수행할 수 없다.

let unknownVar: unknown;

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

// num = unknownVar; // ❌ 오류 발생: 'unknown' 타입은 직접 할당할 수 없음
// unknownVar.toUpperCase(); // ❌ 오류 발생: 'unknown' 타입에는 'toUpperCase' 속성이 없음


any 타입 🆚 unknown 타입

구분anyunknown
모든 타입 할당 가능✅ 가능✅ 가능
다른 타입으로 할당✅ 가능❌ 타입 검사 필요
속성 접근 및 메서드 호출✅ 가능❌ 직접 사용 불가
연산자 사용 (+, -, *, / 등)✅ 가능❌직접 사용 불가


Unknown 타입의 값을 활용하는 방법

unknown 타입의 값을 사용하려면 반드시 타입을 확인해야 한다.
이를 위해 typeof, instanceof 또는 타입 단언 (as) 등을 활용할 수 있다.


1️⃣ typeof를 사용한 타입 좁히기

if (typeof unknownVar === "number") {
  num = unknownVar; // ✅ 타입이 확인되었으므로 정상적으로 할당 가능
}

2️⃣ instanceof를 사용한 타입 좁히기

class Person {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

let obj: unknown = new Person("Alice");

if (obj instanceof Person) {
  console.log(obj.name); // ✅ 타입이 확인되었으므로 안전하게 접근 가능
}

3️⃣ 타입 단언(as) 사용

num = unknownVar as number; // ⚠️ 타입 단언을 사용하면 강제로 타입을 지정할 수 있음
  • 하지만 as를 사용하면 타입 검증이 약해지므로, 가급적 typeof 또는 instanceof를 사용하는 것이 좋다.


🎯 정리

  • any는 모든 타입의 값을 허용하며, 타입 검사가 사라진다.
  • unknown은 모든 값을 저장할 수 있지만, 사용하기 전에 타입 검사를 해야 한다.
  • unknown을 사용하면 보다 안전한 코드 작성이 가능하다.
  • 타입을 확인하는 방법으로 typeof, instanceof, 타입 단언 (as) 등을 활용할 수 있다.

가능하면 any보다 unknown을 사용하는 것이 안전하다.

profile
내가 보려고 만든 벨로그 *'-'*

0개의 댓글