[TypeScript] any vs. unknown vs. never

Jiumn·2025년 8월 29일
post-thumbnail

기술 면접 때 질문을 받고 당황해버린 any, unknown, never 의 차이. 다시 잊지 않기 위해 정확히 기록하고 넘어가자.

any

  • 모든 타입을 허용할 수 있다. 타입 검사를 하지 않는다.
  • 이름 그대로 어떤(=any) 값이든 허용될 수 있다.

unknown

  • TypeScript의 최상위 타입(Top type)이다.

    최상위 타입: 존재할 수 있는 모든 타입들을 포함하는 타입

최상위 타입의 정의를 찾아보다가 타입스크립트의 타입 사이에는 계층이 존재한다는 것을 알게 됐다.

타입스크립트 타입 계층 구조


공식 문서에 이미지가 나와있지는 않지만 내용으로 유추했을 때 위와 같은 계층 구조를 가진다고 한다.

unknown이 이미 선언된 변수에는 하위 계층의 타입을 재선언할 수 없다.

이는 타입스크립트의 타입은 수학의 '집합' 개념과 같기 때문이다.
즉, 전체 집합인 unknown은 어떤 타입이든 될 수 있지만, unknown보다 작은 부분 집합에 해당하는 타입들은 unknown을 대체할 수 없다.

그렇다면 unknown이 타입 검사를 하지 않는 any는 어떤 차이가 있는 걸까?

unknown은 어떤 타입이든 될 수 있지만, 어떤 타입인지 지정이 안된 상태에서는 연산을 할 수가 없다. 이름 그대로 어떤 타입인지 알려져 있지 않기(=unknown) 때문이다.

let anExampleVariable: unknown = "Hello World"

// 숫자로 재할당 가능
anExampleVariable = 1;

// 에러 발생: 'anExampleVariable' is of type 'unknown'.
const anExampleVariableToFixed = anExampleVariable.toFixed(2)

예를 들어 unknown으로 선언했을 때 문자열을 숫자로 재할당 가능하지만 이후 연산을 하려고 하면 type이 unknown 이기 때문에 tofixed() 메소드 적용이 불가능하다.

이때 타입 단언을 하면 연산이 가능해진다.

let anExampleVariable: unknown = "Hello World"
console.log(anExampleVariable)

anExampleVariable = 1;

if (typeof(anExampleVariable) === 'number') {
	const anExampleVariableToFixed = anExampleVariable.toFixed(2) // 에러 발생하지 않음
}

즉, unknown은 어떤 타입이든 할당할 수 있지만 타입 단언(검사)를 하기 전에는 연산을 할 수 없기 때문에 타입 안전성이 any보다 높다.

never

  • TypeScript의 최하위 타입이다.
  • 아무 것도 없음을 의미한다.
  • 함수에서 어떤 값도 반환하지 않음을 의미한다. (집합으로 치면 공집합)

    * never vs. void

    • 함수의 반환값 타입으로 쓰이는 void와 never의 차이는 뭘까?
      : never는 반환값 자체가 존재하지 않는다. 즉, 무한루프나 에러처럼 정상적으로 반환값이 리턴되지 않는 경우다. 그래서 switch 문의 모든 조건을 제외하고 절대 존재할 수 없는 값을 정의하는 경우도 가능하다고 한다.
      반면, void는 주로 undefined를 반환하는 함수 값을 정의할 때 사용한다.

*참고
https://ts.winterlood.com/1d6906f2-b724-43d0-bc61-8ec455e6d8e8

profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글