never 타입

|

코딩애플강의를 보고 정리했습니다.

결론부터

never 타입은 이럴때 지정한다.

  1. 무언가 return 하지 않고,
  2. 끝나지도 않는 함수를 표현하고 싶을 때

하지만, 2번 조건의 함수를 만들 일이 거의 없기 때문에 never타입은 쓸 일이없다.
하지만, 가끔 코드 이상하게 짜면 자동으로 등장하기 때문에 이 때 never 이게 뭘 의미하는지 이해를 하고 넘어가자.

Never type

예시

function 함수(): never {}

never타입은 아래 조건이 맞아야 사용이 가능하다.

  1. 절대 return을 하지 않아야하고,
  2. 함수 실행이 끝나지 않아야한다. (endpoint가 없어야함)

(조건 1,2는 같은 소리인데 모든 자바스크립트 함수 맨 밑엔 return undefined라는 숨겨진 코드를 갖고있어서 그렇다고한다.)

never type을 붙일수 있는것과 없는것

  • 붙일 수 없다.
// 조건1은 만족하지만, 조건2는 만족하지 않음
function 함수() {
  console.log(123);
}
  • 붙일 수 있다.
// never 가능
function 함수(): never {
  while (true) {
    console.log(123);
  }
}
// never 가능
function 함수(): never {
  throw new Error('에러메세지');
}
  • 에러가 나면 전체 코드실행이 중단되니까 2번 조건도 나름 충족되기 때문에 가능하다.

파라미터가 never 타입이 되는 경우

function 함수(parameter: string) {
  if (typeof parameter === 'string') {
    parameter + 1;
  } else {
    parameter;
  }
}

이런 경우 파라미터가 never타입이 된다.

자동으로 never 타입을 가지는 경우

function 함수() {
  throw new Error();
}

let 함수2 = function () {
  throw new Error();
};

차례대로 함수 선언문,함수 표현식인데

함수 선언문이 아무것도 리턴하지 않고 끝나지도 않을 경우 void타입이 자동으로 리턴타입으로 할당되며,

함수 표현식이 아무것도 리턴하지 않고 끝나지도 않을 경우 never타입이 자동으로 리턴타입으로 할당된다.

또는 tsconfig.json에서 strict 옵션을 켜둘 경우 함부로 any 타입을 지정해주지 않는데,

let arr = [];

원래는 any[] 이런 타입이 되지만 any 타입을 가질 수 없어서 never[] 타입이 되기도 한다.