[TS] any와 unknown

TIL

any 타입

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

 

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

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

 

이 경우 any타입을 명시해주면 어떤 타입의 값이든 자유롭게 할당할 수 있다.

let anyVar: any = 10;
anyVar = "hello";       // ✅ 정상
anyVar = true;          // ✅ 정상
anyVar = {};            // ✅ 정상
anyVar = () => {};      // ✅ 정상

anyVar.toUpperCase();   // ✅ 컴파일 시점에는 오류 없음
anyVar.toFixed();       // ✅ 컴파일 시점에는 오류 없음

let num: number = 10;
num = anyVar;           // ✅ 정상: any는 모든 타입에 할당 가능

any 타입의 문제점

any 타입은 오류를 방지하지 못한다.

anyVar = () => {};      // 함수를 할당
anyVar.toUpperCase();   // ❌ 런타임 오류: toUpperCase is not a function

이 코드는 타입스크립트 컴파일 시점에는 오류가 발생하지 않지만, 실행 시점에서 오류가 발생한다.

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

 

이처럼 any 타입은 모든 타입 검사를 우회하므로 가급적 사용하지 않는 것이 좋다. 타입 안전성을 포기하는 것과 같기 때문이다.

 

unknown 타입

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

let unknownVar: unknown;

unknownVar = "";        // ✅ 정상
unknownVar = 1;         // ✅ 정상
unknownVar = () => {};  // ✅ 정상

any 타입과의 차이점

unknown 타입의 값은 다른 타입의 변수에 바로 할당할 수 없다.

let anyVar: any = 10;
let num: number = 10;

num = anyVar;           // ✅ any는 할당 가능

let unknownVar: unknown;
num = unknownVar;       // ❌ 오류: unknown은 number에 할당 불가

또한 unknown 타입의 값에 대해 메서드나 연산을 바로 사용할 수도 없다.

unknownVar * 2;              // ❌ 오류: unknown 타입에 연산 불가
unknownVar.toUpperCase();    // ❌ 오류: unknown 타입에 메서드 호출 불가

 

타입 좁히기 (Type Narrowing)

unknown 타입의 값을 사용하려면 조건문으로 타입을 확인해야 한다.

if (typeof unknownVar === "number") {
  // 이 조건이 참이된다면 unknownVar는 number 타입으로 볼 수 있음
  num = unknownVar;
}

 

이처럼 조건문을 이용해 특정 값이 특정 타입임을 보장하면, 해당 값의 타입이 자동으로 좁혀진다.

이를 타입 좁히기 또는 타입 정제라고 하며, 이때 사용하는 조건문을 타입 가드(Type Guard)라고 한다.

'TIL' 카테고리의 다른 글

[TS] 대수 타입  (0) 2025.10.31
[TS] void와 never  (0) 2025.10.28
[TS] 타입 정의 연습  (0) 2025.10.28
[TS] 열거형 타입  (0) 2025.10.28
[TS] 타입 별칭과 인덱스 시그니처  (0) 2025.10.28
'TIL' 카테고리의 다른 글
  • [TS] 대수 타입
  • [TS] void와 never
  • [TS] 타입 정의 연습
  • [TS] 열거형 타입
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    useState
    Next.js
    함수 타입
    트러블 슈팅
    typescript
    클래스
    cs50
    앱 라우터
    알고리즘
    인터페이스
    제네릭
    페이지 라우터
    ai 감성 일기장
    배열
    generic
    App Router
    react
    문자열
    Pages Router
    CS
    Trouble Shooting
    javascript
    emotion diary
    Spa
    바닐라 자바스크립트
    memory
    자료구조
    algorithm
    C
    타입 좁히기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[TS] any와 unknown
상단으로

티스토리툴바