extends 조건의 왼쪽에 한 번씩
들어갑니다.
유니온이 필터를 통과하는 흐름
T extends U ? T : never에서 T가 그대로 노출되어 있으면
각 멤버가 따로 조건을 통과합니다.
string
|
number
|
boolean
->
string
never
never
->
string
조건이 맞으면 내부 타입을 추출
infer R은 조건의 패턴과 맞는 위치에서 타입을 추론하고,
참 분기에서 그 이름을 결과로 사용할 수 있게 합니다.
() => string
->
infer R
->
R = string
T extends (...args: any[]) => infer R ? R : never
함수 타입의 반환 위치에 있는 타입을 꺼냅니다.
T extends Promise<infer U> ? U : T
감싸진 비동기 결과 타입만 분리합니다.