conditional generic

조건부 타입은 분기, 분산, 추출, 래핑 순서로 읽는다

T extends U ? X : Y는 타입 수준 분기입니다. 제네릭 입력이 유니언인지, 내부 타입을 꺼내는지, 전체 유니언을 한 번에 비교해야 하는지를 차례로 보면 결과를 예측하기 쉽습니다.

기본 분기

할당 가능하면 true 결과, 아니면 false 결과를 선택합니다.

유니언 분산

제네릭 T가 유니언이면 멤버별로 평가될 수 있습니다.

구조 추출

infer는 맞는 패턴 안의 타입을 임시 이름으로 꺼냅니다.

평가 순서 점검표

순서 질문 타입 신호 판단 기준
01 분기 조건 T extends U ? X : Y TU에 할당 가능하면 X, 아니면 Y를 선택합니다.
02 분산 여부 T가 조건 왼쪽에 단독 배치 유니언 멤버를 각각 평가한 뒤 결과 유니언으로 다시 합칩니다.
03 제외 처리 never false로 밀어낼 멤버를 never로 보내면 유니언에서 사라집니다.
04 내부 추출 Promise<infer R> 패턴이 맞을 때 내부 타입을 꺼내 R 같은 이름으로 다음 결과에 씁니다.
05 전체 비교 [T] extends [U] 분산을 막고 유니언 전체가 조건을 만족하는지 한 번에 비교합니다.
06 유틸리티화 ReturnType, Exclude 자주 쓰는 조건부 계산은 내장 유틸리티 타입으로 이미 포장되어 있습니다.

분산이 필요한 경우

  • NonNullable은 null 계열 멤버만 골라 제거합니다.
  • Exclude는 제거할 멤버를 never로 보냅니다.
  • Extract는 조건에 맞는 멤버만 남깁니다.

래핑이 필요한 경우

전체 유니언이 한꺼번에 조건을 만족해야 하는 문제라면 [T] extends [U]처럼 감싸야 합니다. 감싸지 않으면 멤버별 필터링 결과가 섞여 의도보다 넓거나 좁은 타입이 나올 수 있습니다.