Never type 을 알아보자
함수에 붙이는 return type으로 사용가능합니다.
근데 좀 특이합니다.
function 함수() :never{
}
어떤 함수가
조건 1) 절대 return을 하지 않아야하고
조건 2) 함수 실행이 끝나지 않아야합니다 (전문용어로 endpoint가 없어야합니다)
그런 함수에 붙일 수 있는 타입니다.
실은 조건1, 2는 같은 소리인데 모든 자바스크립트 함수 맨 밑엔 return undefined 라는 숨겨진 코드를 가지고 있습니다.
그래서 조건2가 맞으면 1도 맞음
function 함수(){
console.log(123)
}
이런 함수들에 never를 붙일 순 없습니다.
왜냐면 조건 1번은 만족하지만 2번은 만족하지 않습니다.
2번 조건은 함수 내부 코드 실행이 끝나지 않는 함수여야합니다.
function 함수() :never{
while ( true ) {
console.log(123)
}
}
이런 함수엔 붙일 수 있습니다.
while 문법은 ( ) 소괄호안의 조건식이 true일 경우 계속 내부 코드를 실행해라~ 라는 뜻입니다.
무한히 실행되기 때문에 끝이안나죠? 그래서 never 타입을 사용가능합니다.
function 함수() :never{
throw new Error('에러메세지')
}
이런 함수에도 붙일 수 있습니다.
throw new Error() 문법은 그냥 강제로 에러내라~ 라는 뜻인데
에러가 나면 전체 코드실행이 중단되니까 2번 조건도 나름 충족하는 것이기 때문에
never를 사용가능합니다.
그래서 1. 무언가 return 하지 않고 2. 끝나지도 않는 함수를 표현하고 싶을 때 never 타입을 지정하면 되는데
2번 조건의 함수를 만들 일이 거의 없기 때문에 never 타입은 쓸 일이 없습니다.
무언가를 return하고싶지 않을 경우 그냥 void 타입을 이용하시면 되며
배우는 이유는 가끔 코드 이상하게 짜다보면 자동으로 등장하기 때문입니다.
이 때 never 이게 뭘 의미하는지 이해만 잘 하면 됩니다.
어떨 때 등장하는지 알아봅시다.
파라미터가 never 타입이 되는 경우도 있음
function 함수(parameter: string) {
if ( typeof parameter === "string"){
parameter + 1;
} else {
parameter;
}
}
위 함수는 뭔가 이상한 함수입니다.
지금 narrowing을 이용해서 파라미터의 타입이 string 이면 뭔가 해달라고 써놨는데
else 문이 존재합니다. 타입이 string이 아닐 경우 이거 해달라는 뜻입니다.
근데 else문은 말이 안되죠? 지금 파라미터가 string 밖에 못들어오는데 말입니다.
이런 잘못된 narrowing을 사용했을 때 파라미터의 타입이 never로 변합니다. 파라미터에 마우스 올려보셈
이런 건 있을 수 없다, 일어나면 안된다고 알려주는 느낌입니다.
그럴 때 never를 구경할 수 있으니 never 타입이 발견되는 경우 코드를 수정하는게 어떨까요.
자동으로 never 타입을 가지는 경우
자바스크립트는 함수를 만드는 방법이 2개 있습니다.
function 함수(){
}
let 함수2 = function (){
}
위는 함수 선언문,
밑은 함수 표현식이라고 부릅니다. 똑같이 함수만들 수 있는 문법입니다.
function 함수(){
throw new Error()
}
let 함수2 = function (){
throw new Error()
}
함수 선언문이 아무것도 return 하지 않고 끝나지도 않을 경우 void 타입이 자동으로 return 타입으로 할당되며
함수 표현식이 아무것도 return 하지 않고 끝나지도 않을 경우 never 타입이 자동으로 return 타입으로 할당됩니다.
마우스 올려보면 나옵니다.
또는 tsconfig.json에서 strict 옵션을 켜둘 경우
함부로 any 타입을 지정해주지 않는 경우가 있습니다.
그럴 때 array 같은거 대충 타입지정 안하고 만들면
let arr = [];
원래는 any[] 이런 타입이 되는데 any를 가질 수 없어서
never[] 이런 타입이 발견되기도 합니다.
아무튼 쓸 일이 별로 없기 때문에 이럴 때도 등장한다고 알아두기만 하면 됩니다.
<출처 : 코딩애플 - 빠르게 마스터하는 타입스크립트>
'TypeScript' 카테고리의 다른 글
[TS]Narrowing 할 수 있는 방법 더 알아보기 (0) | 2022.11.07 |
---|---|
[TS]함수 rest 파라미터, destructuring 할 때 타입지정 (0) | 2022.11.07 |
[TS]Object에 타입지정하려면 interface도 있음 (0) | 2022.11.07 |
[TS]필드값 타입지정 (0) | 2022.11.07 |
[TS]함수와 methods에 type alias 지정하기 (0) | 2022.11.07 |