📑 목차
이번에는 함수의 반환값과 관련된 특수한 타입인 void 와 never 에 대해 알아본다. 얼핏 보면 비슷해 보일 수 있지만, 쓰임새와 의미가 명확히 다르다.
1. void 타입
void는 '아무런 값도 없음' 을 의미하는 타입이다.
1-1. 함수의 반환값으로 사용
주로 값을 반환하지 않는 함수의 반환 타입으로 사용된다. 자바스크립트에서는 함수에서 아무것도 반환하지 않으면 암묵적으로 undefined를 반환하지만, 타입스크립트에서는 이를 void로 표현한다.
function func2(): void {
console.log("Hello");
}
1-2. 변수의 타입으로 사용
변수에도 void 타입을 지정할 수 있지만, 실용성은 거의 없다. void 타입 변수에는 오직 undefined만 할당할 수 있기 때문이다.
let a: void;
a = undefined; // 가능
// a = 1; // ❌ 불가능
참고: strictNullChecks 옵션 만약 tsconfig.json에서 strictNullChecks 옵션을 false로 설정하면, void 타입 변수에 null 값을 담을 수도 있다. (하지만 엄격한 옵션을 켜두는 것이 권장된다.)
2. never 타입
never는 '불가능' 을 의미하는 타입이다. 즉, 절대 발생할 수 없는 값이나 상태를 나타낼 때 사용한다.
2-1. 함수가 종료되지 않을 때
함수가 무한 루프를 돌아 영원히 종료되지 않는다면, 이 함수는 어떤 값도 반환할 수 없다(반환 자체가 불가능). 이때 never를 사용한다.
function func3(): never {
while (true) {
// 무한 루프
}
}
2-2. 의도적으로 오류를 발생시킬 때
함수 실행 도중 에러를 던져서(throw) 강제로 실행을 중단시키는 경우에도, 정상적인 반환이 불가능하므로 never 타입을 사용한다.
function func4(): never {
throw new Error();
}
2-3. 변수에 사용 시 (가장 엄격한 타입)
변수의 타입을 never로 정의하면, 그 변수에는 어떤 값도 담을 수 없다. 심지어 모든 타입의 치트키인 any 타입의 값조차도 never 타입 변수에는 할당할 수 없다.
let anyVar: any;
let a: never;
// a = 1; // ❌ 오류
// a = undefined; // ❌ 오류
// a = null; // ❌ 오류
// a = anyVar; // ❌ 오류 (any도 안 됨)
이러한 특징 때문에 never는 보통 코드의 흐름상 절대 도달할 수 없는 코드임을 명시하거나, 조건문에서 모든 케이스를 다루었는지 검사(Exhaustiveness Checking)할 때 유용하게 쓰인다.
요약
- void: "비어있음". 아무 값도 반환하지 않는 함수에 사용한다. (
undefined만 호환) - never: "불가능". 영원히 끝나지 않거나 에러를 던지는 함수에 사용한다. (그 어떤 값도 호환되지 않음)
