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은 특정한 타입으로 사용하려면 타입을 좁혀야 하기 때문입니다. unknown은 any와 함께 "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는 실행이 끝날 수 없는 함수에 적용되는 타입입니다.