조건부 타입은 분기, 분산, 추출, 래핑 순서로 읽는다
T extends U ? X : Y는 타입 수준 분기입니다. 제네릭 입력이
유니언인지, 내부 타입을 꺼내는지, 전체 유니언을 한 번에 비교해야
하는지를 차례로 보면 결과를 예측하기 쉽습니다.
기본 분기
할당 가능하면 true 결과, 아니면 false 결과를 선택합니다.
유니언 분산
제네릭 T가 유니언이면 멤버별로 평가될 수 있습니다.
구조 추출
infer는 맞는 패턴 안의 타입을 임시 이름으로 꺼냅니다.
평가 순서 점검표
| 순서 | 질문 | 타입 신호 | 판단 기준 |
|---|---|---|---|
| 01 | 분기 조건 | T extends U ? X : Y |
T가 U에 할당 가능하면 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]처럼 감싸야 합니다. 감싸지 않으면 멤버별
필터링 결과가 섞여 의도보다 넓거나 좁은 타입이 나올 수 있습니다.