Discriminated union(태그된 union)은 모두가 공통의 리터럴 필드(판별자, discriminant)를 공유하는 객체 타입들의 union으로, 컴파일러는 이를 사용해 변형들을 구분하고 안전하게 narrowing합니다.
ts
=
| { : }
| { : ; : }
| { : ; : };
모든 멤버는 status 리터럴을 가집니다. 이를 검사하면 정확히 하나의 변형으로 narrowing되어 그 변형의 필드가 열립니다:
function render(r: Result) {
switch (r.status) {
case "loading": return "...";
case "success": return r.data; // ✅ data는 여기에만 존재
case "error": return r.message; // ✅ message는 여기에만 존재
}
}
loading 케이스에서 r.data에 접근하려 하면 컴파일 오류입니다 — 타입 시스템이 잘못된 조합을 표현 불가능하게 만듭니다.
function render2(r: Result): string {
switch (r.status) {
case "loading": return "...";
case "success": return r.data;
case "error": return r.message;
default:
const _exhaustive: never = r; // ✅ 변형을 추가하고 케이스를 빼먹으면 여기서 오류
return _exhaustive;
}
}
never 대입은 모든 케이스를 처리하도록 강제합니다 — 새 status를 추가하면 컴파일러가 갱신이 필요한 모든 switch를 가리킵니다.
Discriminated union은 상태(loading/success/error), 이벤트/액션(Redux reducer), 그리고 "여러 shape 중 하나"인 데이터를 모델링하는 관용적인 방식입니다.
불법 상태를 불가능하게 만들고, never 트릭과 함께 컴파일 타임 망라성을 제공합니다 — 느슨한 boolean/optional 필드 모델링에 비해 엄청난 안전성 이득입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기