union + never
variant별 props를 나누고 동시에 오면 안 되는 필드는 never로 막는다.
고급 타입은 멋진 문법보다 “이 컴포넌트가 받을 수 있는 상태 조합”을 컴파일 시점에 잠그는 도구다.
union + never
variant별 props를 나누고 동시에 오면 안 되는 필드는 never로 막는다.
generic
입력 값의 타입을 보존해야 하면 제네릭으로 반환 타입을 연결한다.
mapped type
객체의 키 집합 전체에 같은 규칙을 적용할 때 매핑 타입을 쓴다.
| 패턴 | 잡아내는 문제 | 타입 신호 |
|---|---|---|
| Discriminated union | variant에 맞지 않는 props 조합 | type, kind 같은 구분자 |
| never | 함께 오면 안 되는 속성 | href?: never처럼 금지 필드 명시 |
| Generic | 입력 타입을 잃어버리는 helper | <T>가 인수와 반환을 함께 묶음 |
type ButtonProps =
| { as: "button"; onClick: () => void; href?: never }
| { as: "a"; href: string; onClick?: never };
판단 순서: 먼저 허용 조합을 나누고, 그다음 금지 조합을 never로 닫으면 런타임 분기보다 타입 오류가 빨리 보인다.