Never Type?
함수에 붙이는 return type으로 사용을 할 수 있다.
function func(): never {
// ...
}
never type은 사용할 수 있는 조건이 특이한데,
- 함수가 절대 return을 하지 않아야 한다.
- 함수 실행이 끝나지 않아야 한다. ( 즉, endpoint가 없어야 한다. )
두 조건이 모두 충족되어야 사용할 수 있는 타입이다.
※ 사실 같은 소리로 조건 2가 맞으면 1도 맞다...
function func() {
console.log("func");
}
그래서 일반적인 함수들에는 never를 붙일 수 없다.
함수가 끝나지 않는 함수여야 하는데, console을 출력 후 함수가 끝나버리기 때문이다.
function func() :never {
while(true) {
console.log("text");
}
}
while 문법에 true 조건식을 줘서 무한 반복하기 때문에 never를 사용할 수 있다.
function error() :never {
throw new Error("에러메시지");
}
throw new Error() 문법은 강제로 에러를 발생시키는 문법인데, 에러가 나면 전체 코드 실행이 중단되기 때문에
never를 사용할 수 있다.
조건 1. 의 경우에는 무언가 return 하지 않는 함수는 생각보다 많지만, 조건 2. 를 만족하는 함수는 만들 일이 거의 없다.
return 하지 않는 함수를 만들고 싶은 경우에는 void 타입을 사용하면 되기 때문이다.
그럼에도 알아야 하는 이유는 가끔 코딩을 하다 보면 이상하게 자동으로 나타나기 때문이다.
Never가 등장하는 경우
1. 자동으로 never 타입을 가지는 경우
function func() { // -- 함수 선언문
// ...
}
let func2 = function () { // -- 함수 표현식
// ...
}
자바스크립트에서 함수를 만드는 방법은 두 가지가 있다.
하나는 함수 선언문, 다른 하나는 함수 표현식이다. 둘 다 똑같이 함수를 만들 수 있는 문법이다.
함수 선언문의 경우 아무것도 return 하지 않고 끝나는 경우 void 타입이 자동으로 return 타입으로 할당된다.
하지만 함수 표현식의 경우 아무것도 return하지 않을 경우 never 타입이 자동으로 return 타입으로 할당된다.
2. 파라미터가 never 타입이 되는 경우
function func(parameter: string) {
if( typeof parameter === "string") {
parameter + 1;
} else {
parameter;
}
}
narrowing을 사용해서 파마리터의 타입이 string이면 무언가를 하는 작업이 있다.
여기서 끝나면 별 문제없는 일반적인 함수인데, else문이 존재하고 있다.
당연히 타입이 string이 아닐 경우 작업을 하라는 뜻인데, 분명 파라미터는 string 말고는 들어올 수 없다.
잘못된 narrowing을 사용했을 때 파라미터의 타입이 never로 변하게 된다.
일어날 수 없는 경우에 never를 볼 수 있지만, 이런 경우엔 코드를 수정하는 게 더 바람직할 것 같다.
'TypeScript > 기초' 카테고리의 다른 글
[TypeScript] Protected & Static (1) | 2022.07.07 |
---|---|
[TypeScript] Public & Private (1) | 2022.07.07 |
[TypeScript] Narrowing 할 수 있는 방법 (1) | 2022.06.23 |
[TypeScript] rest 파라미터와 Destructring 문법에 타입 지정 (0) | 2022.06.14 |
[TypeScript] interface (0) | 2022.06.12 |