[Typescript] Void와 Never 타입

79ptke·2023년 7월 26일

타입스크립트

목록 보기
8/9
post-thumbnail

오늘은 void 타입과 never 타입에 대해 포스팅하겠습니다.

먼저 void 타입에 대해서 알아보겠습니다.

🎯 Void 타입이란?

void는 공허, 즉 아무것도 없음을 의미하는 타입입니다.
이렇게만 말하니 잘 이해가 안가죠?
예시와 함께 알아보도록 하겠습니다.
두 예시 함수를 비교해보세요.

function func1():string {
    return "hello";
}

문자열을 반환하는 함수입니다.
그럼 이번에는 다른 함수를 보겠습니다.

function func2() {
    console.log("hello"); 
}

위의 함수와 비슷하지만 콘솔로 hello라는 문자열만 출력할뿐 반환하는 값이 없는 것을 볼 수 있습니다. 그럼 이때 func2라는 함수의 반환하는 값의 타입을 무엇으로 해야할까요?

function func2():void {
    console.log("hello"); 
}

정답은 void 타입입니다.

물론 변수에도 void타입을 넣을 수 있습니다.

let a:void;
a = 1; // 에러
a = "hello"; // 에러
a = {}; // 에러
a = undefined;

대신 void 타입으로 정의한 변수의 값에는 어떤 것도 담을 수 없습니다. 숫자도 문자열도 객체도 에러가 나고, 오직 undefined만 담을 수 있습니다.

❗ tsconfig.json파일에 가서 "stricNullChecks"을 false로 하면 예외적으로 void 타입에도 null이 들어갈 수 있기는 합니다.

근데 여기서 뭔가 의문이 들것입니다.
우리는 이미 값이 아무것도 없을 때 undefined라고 배웠을 것입니다. 그리고 null도 있구요. 근데 여기서 void를 쓰는 이유가 무엇일까요❓︎ 그 이유를 알아봅시다.

- void 타입을 쓰는 이유

function func2():undefined {
    console.log("hello"); // 에러
}

다시 위의 예문을 보겠습니다.
만약 여기서 func2라는 함수에 void 타입 대신 undefined를 넣는다면 오류가 발생하기 때문입니다.

function func2():undefined {
    console.log("hello"); 
    return; // <-- 이렇게 라도 넣어야 undefined를 반환함.
    
}

진짜 이 함수한테 undefined라는 값을 반환시켜야하는데 문자열인 hello만 콘솔로 출력할 뿐 undefined를 반환하고 있지 않기 때문입니다.

function func2():null {
    console.log("hello");
    return null;
}

null 타입 역시 마찬가지입니다.
그래서 return문을 사용하고 싶지 않은 함수의 반환값 타입으로는 void 타입을 사용해야합니다. 이런 이유로 void을 쓰는 이유에 대해 알아보았습니다.

이 다음으로는 never 타입에 대해 알아보겠습니다.

🎯 Never 타입이란?

never라는 것은 존재하지 않는, 불가능한 타입이라는 것을 말합니다. 무슨 뜻인지 좀 더 자세하게 알아보겠습니다.

function func3():never {
    while (true) {}  // 절대로 정상적으로 반환이 되지 않아서
}

이렇게 무한 루프의 값에는 어떤 타입을 넣어야할까요? void 타입을 써야할까요? never 타입은 함수가 정상적으로 종료가 되지만 반환문이 없어서 void 타입을 쓰는 경우와는 다르게 함수가 정상적으로 종료가 되지가 않아서 반환을 할 수 없을 때/ 반환값이 있는게 모순이다 하는 경우에 사용합니다.

function func4():never {
    throw new Error();
}

비슷한 예시를 하나 더 보겠습니다. 자바스크립트에서는 이런식으로 에러를 던져주죠? 실행되면 바로 중지되기 때문에 위 함수의 타입으로는 never를 적어줘야합니다.

let a:naver;
a = 1; // 에러
a = "hello"; // 에러
a = {}; // 에러
a = undefined; // 에러
a = null; // 에러

naver 타입은 void타입과 다르게 undefined와 null 역시 에러가 납니다. 위에서 void를 설명하면서 보여드렸던 "stricNullChecks" 옵션을 꺼도 어떠한 값을 담을 수 없습니다.

let anyVar: any;

a = anyVar;

이 any 타입 역시 never 타입 변수에 담을 수 없습니다. 즉, 그 어떤 값도 절대 저장할 수 없을때 사용하는 타입입니다.

이렇게 해서 타입스크립트의 기본 타입에 대해 알아보았습니다.

위의 내용은 <한 입 크기로 잘라먹는 타입스크립트> 강의 내용을 참고하면서 작성했습니다.

0개의 댓글