Conditional Types

유니온 분배와 infer 추출

조건부 타입은 union 멤버를 하나씩 검사한 뒤 결과를 다시 union으로 합칩니다. 같은 조건식 안에서 infer를 쓰면 배열, Promise, 함수 반환값처럼 안쪽에 들어 있는 타입을 새 이름으로 받을 수 있습니다.

distribute

유니온이 필터를 통과하는 흐름

T extends U ? T : never에서 T가 그대로 노출되어 있으면 각 멤버가 따로 조건을 통과합니다.

string | number | boolean -> string never never -> string
멤버별 평가 각 후보가 extends 조건의 왼쪽에 한 번씩 들어갑니다.
never 제거 조건을 만족하지 않은 결과는 union에서 남지 않습니다.
결과 재결합 남은 타입만 다시 합쳐져 최종 타입이 됩니다.
infer

조건이 맞으면 내부 타입을 추출

infer R은 조건의 패턴과 맞는 위치에서 타입을 추론하고, 참 분기에서 그 이름을 결과로 사용할 수 있게 합니다.

() => string -> infer R -> R = string
함수 반환값 T extends (...args: any[]) => infer R ? R : never 함수 타입의 반환 위치에 있는 타입을 꺼냅니다.
Promise 값 T extends Promise<infer U> ? U : T 감싸진 비동기 결과 타입만 분리합니다.