never 타입과 불가능한 상태
never로 도달할 수 없는 코드와 불가능한 값을 모델링합니다.
never 타입과 불가능한 상태은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
never 타입
never는 빈 타입으로, 절대 발생할 수 없는 값을 나타냅니다. never 자체를 제외하면 어떤 값도 never에 할당할 수 없습니다. 발생해서는 안 되는 상황을 표시할 때 사용합니다.
// You cannot create a value of type never
function crash(): never {
throw new Error('boom');
}
try { crash(); } catch (e) { console.log('caught'); }절대 반환하지 않는 함수
항상 throw하는 함수는 정상적으로 반환하지 않으므로 반환 타입이 never입니다. 이를 통해 호출자와 컴파일러에 여기서 실행이 중단된다는 것을 알립니다.
function fail(message: string): never {
throw new Error(message);
}
try { fail('invalid'); } catch (e) { console.log('handled'); }무한 루프는 never를 반환함
무한 루프가 있는 함수도 절대 반환하지 않으므로 never 타입이 됩니다. 컴파일러는 해당 함수 뒤로 제어 흐름이 계속될 수 없다는 것을 인식합니다.
function listen(): never {
while (true) {
// forever
break; // (break added so the demo terminates)
}
throw new Error('stopped');
}
console.log('listen has return type never');never와 void 비교
never와 void를 혼동하지 마십시오. void 함수는 반환하지만 유용한 값을 내놓지 않을 뿐입니다. never 함수는 전혀 반환하지 않습니다. 오류를 발생시키거나 영원히 반복합니다.
function logIt(): void {
console.log('done'); // returns normally
}
function abort(): never {
throw new Error('stop'); // never returns
}
logIt();
try { abort(); } catch (e) { console.log('ok'); }모든 경우 처리 검사에서 never 사용하기
never의 가장 실용적인 용도는 모든 경우 처리 검사입니다. switch의 default에서 변수를 never에 할당하십시오. 모든 경우를 처리했다면 변수는 이미 never이므로 컴파일됩니다.
type Shape = 'circle' | 'square';
function area(s: Shape): string {
switch (s) {
case 'circle': return 'pi r^2';
case 'square': return 'a^2';
default:
const _check: never = s; // ok: all handled
return _check;
}
}
console.log(area('square'));누락된 경우 찾아내기
새로운 유니온 멤버를 추가하고 해당 경우를 빠뜨리면 남은 값은 더 이상 never가 아니므로 할당이 컴파일되지 않습니다. never 검사는 조용히 지나갈 누락을 명확한 오류로 바꿉니다.
type Shape = 'circle' | 'square' | 'triangle';
// If 'triangle' case is missing, assigning s to never
// would error: 'triangle' is not assignable to never.
console.log('Add a case for every member');불가능한 유니온 분기에서 never 사용하기
타입을 좁혀 모든 가능성을 제거하면 남은 타입은 never가 됩니다. 컴파일러는 해당 분기에 도달할 수 없다는 것을 알 수 있으므로 논리적 실수를 발견하는 데 도움이 됩니다.
function check(x: string | number): void {
if (typeof x === 'string') {
console.log('string');
} else if (typeof x === 'number') {
console.log('number');
} else {
// x is never here
console.log('unreachable');
}
}
check('hi');최하위 타입으로서의 never
never는 최하위 타입입니다. 존재할 수 없는 값은 어떤 것과도 형식적으로 호환되므로 모든 다른 타입에 할당할 수 있습니다. 따라서 throw를 어떤 표현식 위치에든 사용할 수 있습니다.
function getOrThrow(v: string | null): string {
return v ?? fail();
}
function fail(): never {
throw new Error('missing');
}
console.log(getOrThrow('value'));유니온을 never로 필터링하기
조건부 타입과 매핑된 타입에서 never는 ‘이것을 제거하라’는 의미로 동작합니다. never와 유니온해도 아무것도 바뀌지 않습니다. T | never는 그저 T입니다. 따라서 필터링에 자연스럽게 사용할 수 있습니다.
type Keep<T> = T extends string ? T : never;
type R = Keep<'a' | 1 | 'b'>; // 'a' | 'b'
const x: R = 'a';
console.log(x);불가능한 상태 모델링
객체 형태에 never를 사용하면 잘못된 조합을 표현할 수 없게 만들 수 있습니다. 여기서는 타입이 이를 금지하므로 ‘로딩 중’ 상태가 데이터도 함께 가질 수 없습니다.
type State =
| { status: 'loading'; data?: never }
| { status: 'ready'; data: number };
const s: State = { status: 'ready', data: 7 };
console.log(s);never로 리팩터링 안전성 향상
never를 사용한 모든 경우 처리 검사는 경우가 누락되면 실패하므로 리팩터링을 더 안전하게 만듭니다. 유니온을 확장하면 컴파일러가 업데이트가 필요한 모든 위치를 알려 줍니다.
type Cmd = 'start' | 'stop';
function run(c: Cmd): string {
if (c === 'start') return 'starting';
if (c === 'stop') return 'stopping';
const _x: never = c;
return _x;
}
console.log(run('start'));빠른 확인
never 타입에 대한 이해도를 확인해 보십시오.
복습: never
never에 대해 다음을 배웠습니다:
- 빈 타입입니다. 어떤 값도 never 타입이 될 수 없습니다.
- 오류를 발생시키거나 영원히 반복되는 함수의 반환 타입입니다.
- switch 기본값에서 모든 경우를 처리했는지 검사하는 기능을 제공합니다.
- 불가능한 타입 좁히기 분기에 나타나며 타입 논리에서 유니온을 필터링합니다.
다음으로 void를 살펴보고 둘의 차이를 알아봅니다.
function assertNever(x: never): never {
throw new Error('Unexpected: ' + String(x));
}
console.log('assertNever guards exhaustiveness');자주 묻는 질문
“never 타입과 불가능한 상태” 강의는 무료인가요?
네 — “never 타입과 불가능한 상태” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“never 타입과 불가능한 상태”에서 뭘 배우나요?
never로 도달할 수 없는 코드와 불가능한 값을 모델링합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“never 타입과 불가능한 상태” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- unknown과 any 이해하기
- never 타입과 불가능한 상태
- 함수에서의 void 타입
- unknown의 타입 안전한 처리