[TYPESCRIPT] infer 키워드로 타입 추론하기 — 조건부 타입의 핵심 메커니즘

TypeScript에서 복잡한 타입을 다룰 때, 특정 타입 내부에서 일부 타입을 추출해 재사용해야 하는 상황이 자주 발생합니다. 예를 들어 함수의 반환 타입을 가져오거나, Promise의 내부 타입을 꺼내거나, 튜플 요소 타입을 분리하고 싶은 경우입니다. 이때 사용되는 기능이 바로 infer 키워드입니다.

infer는 조건부 타입과 함께 사용되며 “이 위치의 타입을 추론해서 변수처럼 사용하겠다”는 의미입니다. 즉, infer는 타입 레벨에서의 “타입 추출” 기능입니다.

 

infer의 기본 형태

infer는 조건부 타입에서 사용되며 다음과 같은 형태를 갖습니다.

type ReturnTypeOf<T> = T extends (...args: any[]) => infer R ? R : never;

이 코드에서 infer R은 함수 반환 타입을 추론하여 R이라는 이름의 타입 변수로 저장합니다.

 

함수 반환 타입 추출 예제

type MyFunction = () => number;
type Result = ReturnTypeOf<MyFunction>;
// number

TypeScript의 기본 유틸리티 타입 ReturnType<T>도 infer를 기반으로 구현됩니다.

 

Promise 내부 타입 추출하기

Promise<T> 안의 타입을 추출하는 것은 infer의 대표적인 활용 사례입니다.

type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

type A = UnwrapPromise<Promise<string>>; // string
type B = UnwrapPromise<number>;          // number

API 응답 처리, 비동기 데이터 모델링에서 매우 유용합니다.

 

배열과 튜플에서 내부 요소 타입 추출

type ElementOf<T> = T extends (infer U)[] ? U : never;

type ArrType = ElementOf<string[]>; // string
type TupleType = ElementOf<[number, string]>; // number | string

배열/튜플의 단일 요소 타입을 쉽게 가져올 수 있습니다.

 

클래스 생성자 타입에서 인스턴스 타입 추출

type InstanceTypeOf<T> = T extends new (...args: any[]) => infer R ? R : never;

class User {
  id = 1;
}

type UserInstance = InstanceTypeOf<typeof User>;
// User

DI 컨테이너, 팩토리 패턴 등 클래스 기반 구조에서 자주 활용됩니다.

 

여러 infer 사용 가능 (튜플 분리)

type FirstAndRest<T> = T extends [infer F, ...infer R] ? [F, R] : never;

type Result = FirstAndRest<[number, string, boolean]>;
// [number, [string, boolean]]

스프레드 연산자와 함께 사용하면 구조 분해가 가능합니다.

 

객체 프로퍼티에서 value 타입 추출

type ValueOf<T> = T extends { [key: string]: infer V } ? V : never;

type Obj = { a: number; b: string };
type Result = ValueOf<Obj>;
// number | string

infer는 객체 타입에서도 자유롭게 사용할 수 있습니다.

 

infer 사용 시 주의할 점

  • 반드시 조건부 타입 내에서만 사용 가능
  • 추출 실패 시 fallback 타입을 명확히 지정해야 함 (예: : never)
  • 타입 추출 규칙이 복잡할 경우 타입 가독성이 낮아질 수 있음
  • infer가 남발되면 설계보다 퍼즐 맞추기 같은 타입이 될 수 있으니 목적에 맞게 사용 필요

 

왜 infer를 알아야 할까? (실무 관점)

infer를 이해하면 다음 작업들이 훨씬 쉬워집니다:

  • API 응답 타입 자동 추출
  • 비동기 함수/Promise 내부 모델 추출
  • 복잡한 DTO/Entity 변환의 타입 자동화
  • 함수/클래스/튜플 타입에서 필요한 조각만 가져오기

즉, infer는 타입을 생성하는 타입을 만들기 위해 필수적인 기능입니다.

 


 

infer 키워드는 조건부 타입 내부에서 타입을 추론하여 변수처럼 활용할 수 있는 기능입니다. 이를 통해 기존 타입을 기반으로 새로운 타입을 만들거나 일부만 추출할 수 있어, 대규모 타입 시스템을 자동화하고 유지보수를 극적으로 개선할 수 있습니다.

  • infer = 타입 추출 변수
  • 조건부 타입과 함께 사용
  • 함수 / Promise / Tuple / Class / Object 등에서 자유롭게 응용 가능