본문 바로가기
Frontend2026년 7월 5일4분 읽기

TypeScript any·unknown·never 차이와 실전 사용

YS
김영삼
조회 244
TypeScript any·unknown·never 차이와 실전 사용

핵심 요약

any는 "타입 검사를 꺼라"(위험), unknown은 "무엇인지 모르니 쓰기 전에 확인해라"(안전한 any), never는 "이 값은 절대 존재할 수 없다"이다. 외부에서 들어오는 정체불명 값엔 any 대신 unknown을 쓰는 게 핵심 습관이다.

1. any — 검사를 꺼버림

let x: any = 3
x.foo.bar()      // 컴파일 통과, 런타임 터짐 💥
x = "hello"      // 뭐든 허용

any는 전염된다 — any 값을 쓰면 그 결과도 any가 되어 타입 안전성이 구멍 난다.

2. unknown — 안전한 any

let x: unknown = JSON.parse(input)
x.foo            // ❌ 컴파일 에러 — 먼저 확인하라
if (typeof x === "object" && x !== null && "foo" in x) {
  // 여기선 좁혀져서 안전하게 접근
}

unknown은 어떤 값이든 담을 수 있지만, 타입을 좁히기(narrowing) 전에는 아무 연산도 못 하게 강제한다.

3. never — 존재할 수 없는 값

// 항상 예외를 던지는 함수의 반환형
function fail(msg: string): never { throw new Error(msg) }

// switch 완전성 검사에 활용
function area(s: Shape) {
  switch (s.kind) {
    case "circle": return ...
    case "square": return ...
    default: const _: never = s  // 케이스 빠지면 컴파일 에러
  }
}

4. 언제 무엇을

상황선택
API·JSON.parse 결과unknown → 검증 후 사용
정말 타입을 못 정할 때가능하면 제네릭, 최후에 any
도달 불가 코드 표시never
완전성(exhaustiveness) 검사never 할당

5. 함정

  • any 남발은 TypeScript를 쓰는 의미를 없앤다 — noImplicitAny·eslint no-explicit-any로 통제
  • 외부 라이브러리 타입이 없어 any가 불가피하면 경계에서 한 번만 감싸고 내부는 타입을 붙인다
  • unknown을 좁힐 땐 타입 가드(typeof·in·커스텀 가드)를 쓴다

자주 묻는 질문

any 대신 unknown을 쓰면 뭐가 좋나요?

unknown은 사용 전에 타입 확인을 강제하므로 런타임 에러를 컴파일 단계에서 잡습니다. any는 검사를 완전히 꺼버려 x.foo.bar() 같은 코드도 그냥 통과시켜 배포 후 터집니다. "정체 모를 값"엔 unknown이 정답입니다.

never는 실무에서 언제 쓰나요?

대표적으로 switch/if의 완전성 검사입니다. 모든 케이스를 처리했으면 default에서 남는 타입이 never가 되고, 나중에 케이스가 추가돼 처리를 빠뜨리면 컴파일 에러가 나 실수를 막아줍니다.

제네릭과 any는 어떻게 다른가요?

any는 타입 정보를 버리지만 제네릭은 타입을 "그대로 전달"합니다. identity<T>(x: T): T는 넣은 타입을 유지해 반환하므로, 유연하면서도 타입 안전성을 잃지 않습니다. any를 쓰고 싶을 때 먼저 제네릭으로 풀리는지 보세요.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록