QUESTION #0222
프론트엔드

never와 unknown 타입에 대해서 설명해주세요.

never와 unknown 타입에 대해서 설명해주세요.

분야: 프론트엔드


never

먼저, never절대 발생할 수 없는 값을 나타내는 타입입니다. 함수가 값을 반환하지 않고 항상 예외를 던지거나 무한 루프를 도는 경우, 그 반환 타입은 never가 됩니다. never는 "bottom type"이라고도 불리며, 모든 타입의 하위 타입입니다.

예를 들어, 다음과 같이 never를 사용할 수 있습니다.

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

이 함수는 어떤 값도 반환하지 않으며, 실행될 경우 예외를 던지기 때문에 never 반환 타입을 갖습니다.

이외에도, if-else, switch 문을 통한 타입 검사 과정에서 허용된 케이스에 포함되지 않은 경우에 대응하기 위해 never를 사용하기도 합니다.

unknown

반면, unknown알 수 없는 값을 나타내는 타입입니다. "외부 API 호출 결과"와 같이 구체적인 타입을 미리 알 수 없고, 런타임에 타입이 결정되는 경우에 사용합니다. any와 비슷하지만 더 안전한 방식입니다. any는 어떤 값이든 허용하기 때문에 타입 안정성이 떨어질 수 있지만, unknown은 특정한 타입으로 사용하려면 타입을 좁혀야 하기 때문입니다. unknownany와 함께 "top type"이라고도 불리며, 모든 타입의 상위 타입입니다.

예를 들어, 다음과 같이 unknown을 사용할 수 있습니다.

function processUnknownValue(value: unknown) {
    if (typeof value === 'string') {
      //
    } else if (typeof value === 'number') {
      //
    } else {
      //
    }
}

이처럼 unknown은 직접 타입을 강제할 수 없으며, 타입을 좁혀야 사용할 수 있다는 점에서 any보다 안전한 선택입니다. 이를 활용하면 예상치 못한 타입 오류를 방지할 수 있습니다.

never 타입과 void 타입의 차이점은 무엇인가요? 🤔

void는 함수가 명시적으로 값을 반환하지 않음을 의미하지만, never 타입은 아예 반환될 수 없는 상태를 나타냅니다. 예를 들어, void는 반환값 없이 return;을 하는 함수에서 사용될 수 있지만, never는 예외를 던지거나 무한 루프에 빠지는 함수에만 적용될 수 있습니다. 즉, void는 정상적인 종료를 하지만 never는 실행이 끝날 수 없는 함수에 적용되는 타입입니다.

추가 학습 자료를 공유합니다.