함수 선언문과 함수 표현식일 때 차이가 있습니다. 함수 선언문은 throw를 하더라도 반환값의 타입이 void입니다. 반면 함수 표현식은 never가 됩니다. 따라서 result1은 void로, result2는 never로 추론됩니다. result1에 never 타입을 표기해보면 에러가 발생합니다. void 타입은 never 타입에 대입할 수 없기 때문입니다.
infinite 함수의 경우 무한 반복문이 들어 있어 함수가 값을 반환하지 않습니다. 이런 경우에도 never가 반환값의 타입이 됩니다. 무한 반복문도 함수 표현식일 때만 never 타입을 반환하고, 함수 선언문일 때는 void 타입을 반환합니다.
다음 경우에도 never 타입을 확인할 수 있습니다.
function strOrNum(param: string | number) {
if (typeof param === 'string') {
} else if (typeof param === 'number') {
} else {
param;
}
}
// (parameter) param: never