
기술 면접 때 질문을 받고 당황해버린 any, unknown, never 의 차이. 다시 잊지 않기 위해 정확히 기록하고 넘어가자.
최상위 타입: 존재할 수 있는 모든 타입들을 포함하는 타입
최상위 타입의 정의를 찾아보다가 타입스크립트의 타입 사이에는 계층이 존재한다는 것을 알게 됐다.

공식 문서에 이미지가 나와있지는 않지만 내용으로 유추했을 때 위와 같은 계층 구조를 가진다고 한다.
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 vs. void
- 함수의 반환값 타입으로 쓰이는 void와 never의 차이는 뭘까?
: never는 반환값 자체가 존재하지 않는다. 즉, 무한루프나 에러처럼 정상적으로 반환값이 리턴되지 않는 경우다. 그래서 switch 문의 모든 조건을 제외하고 절대 존재할 수 없는 값을 정의하는 경우도 가능하다고 한다.
반면, void는 주로 undefined를 반환하는 함수 값을 정의할 때 사용한다.
*참고
https://ts.winterlood.com/1d6906f2-b724-43d0-bc61-8ec455e6d8e8