infer 키워드는 쉽게 말해서, ts 타입 추론에 의한 값을 사용하겠다는 것을 의미한다. 즉, infer R
에서 R
은 ts가 추론한 타입을 갖는다.
ReturnType이라는 유틸리티 타입의 정의를 살펴보자
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
ReturnType은 제네릭으로 (...args: any) => any
꼴의 함수 타입을 받고 있다. 그리고 반환하는 함수부를 해석해보면 다음과 같다.
"제네릭으로 받은 T가 (...args: any) => infer R
형태를 보이면 R
을 반환하고, 그렇지 않으면 any
를 반환하라."
여기서 infer R은 ts가 자체적으로 추론한 함수의 return type을 의미한다.
const returnString = () =>{
return 'hi'
}
// returnString은 () => string으로 추론됨
const returnNumber = () =>{
return 1
}
// returnNumber는 () => number로 추론됨
위 예시에서 () => string
으로 추론되는 returnString을 ReturnType에 넘긴다면 (...args: any) => infer R
형태에 () => string
이 대치되면서 R이 string 타입을 갖게 된다.
type returnType1 = ReturnType<typeof returnString>; //string
type returnType2 = ReturnType<typeof returnNubmer>; //number