Develop/TypeScript

[Typescript] never 타입

dawonny 2023. 9. 30. 02:29
728x90
반응형

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: 코딩애플

728x90
반응형