TypeScript

[TypeScript] void 타입과 never 타입

2025년 11월 26일
4
TypeScriptStudy기초문법TypeSafety

📑 목차

이번에는 함수의 반환값과 관련된 특수한 타입인 voidnever 에 대해 알아본다. 얼핏 보면 비슷해 보일 수 있지만, 쓰임새와 의미가 명확히 다르다.

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)할 때 유용하게 쓰인다.


요약

  1. void: "비어있음". 아무 값도 반환하지 않는 함수에 사용한다. (undefined만 호환)
  2. never: "불가능". 영원히 끝나지 않거나 에러를 던지는 함수에 사용한다. (그 어떤 값도 호환되지 않음)
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글