infer 타입

infer 타입을 설명하기에 앞서 inter 타입과 같이 쓰이는 conditional 타입에 대해 알아보겠습니다.

Conditional Type

type Extract<T,U> = T extends U ? T : never

Conditional Types의 조건문에 올 수 있는 문법은 제한적입니다.

타입에서 조건을 나타낼 수 있는 문법은 extends 키워드 밖에 없습니다.

infer에 대하여

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

인자로 받을 타입 TT 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 로 반환 타입을 이름 붙여서 가져오기 위해 함수의 타입 정의를 다시 기술한 것에 불과하다.