TypeScript기본 타입과 좁히기

any, unknown, never 차이

안전성을 거의 포기하는 any, 확인이 필요한 unknown, 도달 불가능을 나타내는 never의 차이를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

ts
let raw: unknown = JSON.parse("{}");

if (typeof raw === "object" && raw !== null) {
  console.log(raw);
}

설명

  • any는 타입 검사를 거의 우회하므로, 급할 때는 편하지만 장기적으로는 TypeScript의 이점을 크게 줄입니다.
  • unknown은 "무슨 타입인지 아직 모른다"를 뜻하며, 사용 전에 확인 절차를 거치게 강제해 더 안전합니다.
  • 외부 입력, JSON 파싱 결과, catch 값처럼 불확실한 데이터는 any보다 unknown이 더 적절한 경우가 많습니다.
  • never는 도달할 수 없는 상태나 모든 경우를 다 처리한 뒤 남는 불가능한 타입을 나타냅니다.
  • 특히 exhaustive check에서 never를 사용하면, union의 누락된 경우를 컴파일 시점에 더 잘 잡을 수 있습니다.

짧은 예제

ts
function fail(message: string): never {
  throw new Error(message);
}

function parse(input: unknown) {
  if (typeof input === "string") {
    return input.trim();
  }

  return fail("string expected");
}

빠른 정리

타입의미
any타입 검사 우회, 가장 느슨함
unknown아직 모름, 사용 전 확인 필요
never불가능하거나 끝나지 않는 흐름
권장불확실한 값엔 unknown 우선
위험any 남용은 타입 안정성 약화

주의할 점

any는 일시적인 탈출구로만 쓰는 편이 좋습니다. 한 번 넓게 퍼지기 시작하면 타입 정보가 연쇄적으로 약해져, 나중에는 TypeScript가 있어도 오류를 잡기 어려워집니다.

참고 링크

2 sources