TypeScript Never type

sangyong park·2023년 3월 26일
0
post-thumbnail

Never type

함수에 붙는 return type으로 사용이 가능하다.

never 타입은 특이한 조건이 있다.

  • 절대 return을 하지 않아야한다.
  • 함수 실행이 끝나지 않아야한다. (endpoint가 없어야 함)
<script>
function hello() {
	console.log(123)
}
</script>

이런 함수들에 never를 붙일 수 없다. 조건 1번은 만족하지만 2번은 만족하지 않는다.
2번 조건은 함수 내부 코드 실행이 끝나지 않는 함수여야한다.

<script>
function hello() :never {
	while(true) {
    	console.log(123)
    }
}
</script>

이런 함수에는 사용이 가능하다. while 문법은 소괄호안의 조건식이 true일 경우 계속 내부 코드를 실행한다. 조건식을 true로 주어서 무한히 실행되기 때문에 이럴 때 never 타입 사용가능

<script>
function hello() :never {
	throw new Error("err")
}
</script>

throw new Error() 문법은 강제로 에러를 내기 때문에 에러가 나면 전체 코드실행이 중단되니까 2번 조건도 나름 충족하는 것이기 때문에 never를 사용 가능하다.

never 타입이 등장할 때

무언가를 return 하지 않고 끝나지도 않는 함수를 표현하고 싶을 때 never 타입을 지정하면 되는데 2번 조건의 함수를 만들 일이 거의 없기 때문에 never 타입은 쓸 일이 없다.

무언가를 return 하고싶지 않을 경우 void 타입을 사용하면 된다. 그럼에도 never 타입을 알아야 하는 이유는 가끔 코드를 짜다보면 자동으로 등장하기 때문이다.

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

<script>
function 함수(parameter: string) {
  if ( typeof parameter === "string"){
    parameter + 1;
  } else {
    parameter;
  }
}
</script>

위 함수는 파라미터의 타입이 string 이면 무언가를 해달라고 했는데 else 문이 존재한다. 타입이 string이 아닐 경우 이거 해달라는 뜻이다.

그런데 타입이 string 밖에 들어오지 못하는데 else문이 존재하기 때문에 이상한 함수이다. 이런 잘못된 narrowing을 사용했을 때 파라미터의 타입이 never로 변한다.

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

<script>
function 함수(){
  throw new Error()
}

let 함수2 = function (){
  throw new Error()
}
</script>

함수 선언문과 함수 표현식이 있다. 함수 선언문이 아무것도 return 하지 않고 끝나지도 않을 경우 void 타입이 자동으로 타입으로 할당되며, 함수 표현식은 아무것도 return 하지 않고 끝나지도 않을 경우 never 타입이 자동으로 할당된다.

이와 같이 쓸 일이 별로 없기 때문에 이럴 때도 등장한다고만 알아두면 좋다.

profile
Dreams don't run away It is always myself who runs away.

0개의 댓글