infer 타입을 설명하기에 앞서 inter 타입과 같이 쓰이는 conditional 타입에 대해 알아보겠습니다.
type Extract<T,U> = T extends U ? T : never
Conditional Types의 조건문에 올 수 있는 문법은 제한적입니다.
타입에서 조건을 나타낼 수 있는 문법은 extends
키워드 밖에 없습니다.
infer
는 조건문에 쓰이는 타입 중 하나를 이름 붙여서 빼 와서, 상항 연산자의 true절이나 false절에서 사용한다.
아래 타입을 해석해보자
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any
📗목차
ReturnType
은 하나의 타입을 인자 T
로 받아서, R
이나 any
타입을 얻는다.
T extends (...args: any) => any
인자로 받을 타입 T
는 T extends (...args: any) => any
조건을 만족해야 한다.
T
는 (...args: any) => any
보다 작거나 같은 개념이어야 한다. ( T가 (…args: any) ⇒ any 에 할당될 수 있어야 한다.)
T
는 함수여야 한다.
T extends (...args: any) => infer R ? R : any
T extends (...args: any) => infer R
가 참이면 R
을, 그렇지 않으면 any
를 반환한다.
infer R
을 해석하자면, T는 함수여야 하는데, 그의 반환 타입을 R이라고 이름 붙일거고, 이를 true 절에서 사용한다.
그런데 왜 인자로 T
를 받는 부분에서 T
가 함수인 것을 체크했는데 다시 extends
키워드가 등장한 것일까?
이는 infer R
로 반환 타입을 이름 붙여서 가져오기 위해 함수의 타입 정의를 다시 기술한 것에 불과하다.