
오늘은 void 타입과 never 타입에 대해 포스팅하겠습니다.
먼저 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를 쓰는 이유가 무엇일까요❓︎ 그 이유를 알아봅시다.
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라는 것은 존재하지 않는, 불가능한 타입이라는 것을 말합니다. 무슨 뜻인지 좀 더 자세하게 알아보겠습니다.
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 타입 변수에 담을 수 없습니다. 즉, 그 어떤 값도 절대 저장할 수 없을때 사용하는 타입입니다.
이렇게 해서 타입스크립트의 기본 타입에 대해 알아보았습니다.
위의 내용은 <한 입 크기로 잘라먹는 타입스크립트> 강의 내용을 참고하면서 작성했습니다.