본문 바로가기

Front-End: Web/TypeScript

[코딩애플] ts part 2-3. never type

반응형

함수에 사용하는 never 타입도 있긴 합니다

쓸데는 없는데 나오면 알아야하니까 배워보자.

function return 값에 붙일 수 있는 never type

function 함수() :never {

}

void와 유사하게 리턴을 하지 않아야 한다. 하지만 엄격한 조건들이 있다.

조건

1) return 값이 없어야 함2) 함수실행이 끝나지 않아야 함 (=endpoint가 없어야 함)

사실 1) 2)가 동일한 말이긴 하다. 사실 함수는 return을 하지 않아줘도 undefined를 반환한다.

fuction 함수() {
	return undefined;
}

그래서 항상 함수는 리턴값을 가진다. 그렇기에 조건2를 충족하면 조건1도 자동적으로 충족시킨다.

함수가 절대 끝나지 않아야 never 타입을 지정할 수 있다.

what is 끝나지 않는 함수? (=endpoint가 없는 함수)

function 함수() :never {
    throw new Error(); // 크롬 콘솔창에서 빨간 에러나서 코드 실행이 중단됨
}

에러를 내면 함수 실행이 도중에 중단되어서 끝나지 않는다. 조건1) 2)를 충족하므로 never 타입을 가질 수 있다.

또한 이런 경우도 함수가 끝나지 않는다.

function 함수() :never {
    while(true) { ... }
}

함수가 영원히 끝나지 않기 때문에 never 타입을 리턴한다고 코드 지정할 수 있다.

실제 코딩생활에서의 never 타입 쓰는 법

-> 대부분 쓸데 없음. 왜냐하면 대부분은 void로 대체하면 되기 때문.

그래도 왜 never를 알아야하냐? 한다면, never 타입은 코드 이상하게 짜면 출몰하기 때문이다.

never 타입 등장하는 경우

1) 뭔가 이상한 narrowing

코드를 이상하게 짜본다 하자.

function 함수(parameter :string){
    if(typeof parameter === 'string'){
        conosle.log(parameter);
    } else {
        console.log(parameter); // parameter: never (이런 경우는 never임)
    }
}

파라미터의 타입을 'string'으로 주었기 때문에 typeof parameter가 'string'일 수 밖에 없다. 그래서 else문에서 parameter의 타입은 "never"가 된다. else가 실행될 일은 원천 차단되기 때문이다. 그래서 타입스크립트가 강제로 never 타입을 준다.

2) 어떤 함수 표현식은 return 타입이 자동으로 never

함수에 강제로 에러를 내뱉게 하자.

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

함수에 마우스를 갖다대면 <code>let 함수: () => never</code>라고 뜬다. never 타입을 리턴한다는 거다.

never 타입은 그럴일이 없다, 뭔가 이상하다, 와 같은 sign 같은 거라고 알고 있으면 된다. 그래서 굳이 쓸 일은 없고 등장하면 이해할 수만 있으면 된다.

반응형