advanced type patterns

Props 타입은 허용할 조합과 금지할 조합을 먼저 나눈다

고급 타입은 멋진 문법보다 “이 컴포넌트가 받을 수 있는 상태 조합”을 컴파일 시점에 잠그는 도구다.

한 번에 하나만 허용? union + never

variant별 props를 나누고 동시에 오면 안 되는 필드는 never로 막는다.

값에 따라 결과 타입 변경? generic

입력 값의 타입을 보존해야 하면 제네릭으로 반환 타입을 연결한다.

모든 key를 검사? 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로 닫으면 런타임 분기보다 타입 오류가 빨리 보인다.