never 타입을 굳이 쓸일은 없을 수 있지만
개발하다가 나오면 어떤 건지는 알기위해..! never 키워드에 대해서 배워보자
never 란
함수에 void 타입을 붙이듯 return type 으로 쓸 수 있다.
예를 들어 다음과 같다
function myFunc() :never{
}
myFunc 이라는 함수는 다음을 만족한다
1. return 을 하면 안된다
2. 함수에 endpoint 가 없어야한다
(둘이 같은 얘기이기는 하다)
여기서 endpoint 가 없어야한다는 것은 함수실행이 끝나지 않는 것이다.
while(true) 때문에 함수 실행이 끝나지 않는.. 그런 예시를 생각해보면 되겠다.
function 함수() :never{
throw new Error('에러메세지')
}
위의 예시를 보자면
throw new Error() 문법으로 강제로 에러를 내고 있다.
이렇게 되면 전체 코드 실행이 중단되는 것이니(함수 실행이 끝나지 않으니) never 키워드를 사용할 수 있다.
결론적으로 뭔가 return 하지 않으면서 실행이 안끝나는 함수를 만들때 never 타입을 지정한다.
하지만 보통은 뭔가 return 하는게 없을 땐 그냥 void 타입을 쓰면 되지 않나? 라는 생각이 든다.
그럼 never 는 언제 등장하지?
parameter 가 never 타입이 되는 경우
function 함수(parameter: string) {
if ( typeof parameter === "string"){
parameter + 1;
} else {
parameter;
}
}
위의 이상한 함수를 보자
narrowing 을 이용해서 string 타입의 파라미터를 받아, 이 파라미터 타입이 string 인 경우에는 ~~을 해달라-라고 코드를 짜놨는데
else 문이 있다. 이 else 문은 파라미터의 타입이 string 이 아닌 경우를 말하는데 말이 안된다.
왜냐면 지금 string 타입인 파라미터밖에 못들어오는데 else 문에 해당할리가 없기 때문이다.
이런 잘못된 narrowing을 사용하면 파라미터의 타입이 never 로 변한다(이런 일은 있을 수 없고 일어나면 안됩니다!라는 의미)
자동으로 never 타입을 가지는 경우
JS 에서 함수를 만드는 방법을 두가지 생각해보자
하나는 함수를 선언해서 만들기, 하나는 함수를 만들어서 변수처럼 집어넣기가 있을 것이다.
아래는 예시이다.
function 함수(){
}
let 함수2 = function (){
}
위는 함수 선언문, 아래는 함수 표현식이다.
function 함수(){
throw new Error()
}
let 함수2 = function (){
throw new Error()
}
근데 위 함수선언문처럼 return 하는게 없으면 void 타입이 자동으로 return 에 할당된다.
하지만 함수 표현식처럼 return 하는게 없이 끝나면 never 타입이 자동으로 return 에 할당된다.
그 밖의 경우
tsconfig.json 에서 strict 옵션을 켜두면 any 타입을 함부로 지정안해준다.
따라서
let arr = [];
위와 같은 경우 타입 지정을 안해줘서 any[] 가 되는데 any를 가질 수 없어서
never[] 타입이 되기도 한다.
ref: 코딩애플