개발새발

Parameters, Constructorparameters, ReturnType, InstanceType 본문

Typescript

Parameters, Constructorparameters, ReturnType, InstanceType

비숑주인 2025. 4. 12. 14:09

타입스크립트의 고급 타입 기능 중에서도 infer는 조건부 타입과 결합되어 타입 추론을 할 수 있게 해준다. infer는 특히 함수나 생성자 타입에서 내부 타입(인자, 반환값 등)을 꺼내올 때 사용되며, 타입스크립트에서 기본 제공하는 유틸리티 타입들 중 다음 네 가지에 사용된다:

  • Parameters<T>
  • ConstructorParameters<T>
  • ReturnType<T>
  • InstanceType<T>

 

1. Parameters<T>: 함수 매개변수 타입 추출

type MyParameters<T extends (...args: any) => any> =
  T extends (...args: infer P) => any ? P : never;
type Fn = (a: number, b: string) => boolean;
type Params = MyParameters<Fn>; 
// 결과: [number, string]

 

  • infer P를 통해 함수의 매개변수 배열을 추론한다.
  • 추론이 성공하면 P를 반환, 실패하면 never.

2. ConstructorParameters<T>: 생성자 매개변수 타입 추출

type MyConstructorParameters<T extends abstract new (...args: any) => any> =
  T extends abstract new (...args: infer P) => any ? P : never;
class C {
  constructor(x: string, y: number) {}
}

type CParams = MyConstructorParameters<typeof C>; 
// 결과: [string, number]

 

  • abstract new (...args: any) => any는 모든 생성자 함수를 의미하며 추상 클래스도 포함.
  • 함수의 new 시그니처에서 infer P로 생성자 인자 타입을 추론한다.

3. ReturnType<T>: 함수 반환값 타입 추출

type MyReturnType<T extends (...args: any) => any> =
  T extends (...args: any) => infer R ? R : any;
type Fn = () => Promise<string>;
type Res = MyReturnType<Fn>; 
// 결과: Promise<string>

 

  • 함수의 반환 타입을 infer R로 추론하고 그대로 사용한다.
  • 실패할 경우 any를 반환하게 처리.

4. InstanceType<T>: 클래스 인스턴스 타입 추출

type MyInstanceType<T extends abstract new (...args: any) => any> =
  T extends abstract new (...args: any) => infer R ? R : any;
class Person {
  name = 'sunho';
}

type PersonInstance = MyInstanceType<typeof Person>; 
// 결과: Person

 

  • 생성자 함수에서 new의 반환 타입이 곧 클래스 인스턴스 타입이다.
  • infer R로 그 값을 꺼낸다.
유틸리티 타입 추출 대상 조건부 타입 패턴 예시 결과
Parameters<T> 함수의 매개변수 T extends (...args: infer P) => any [number, string]
ConstructorParameters<T> 생성자 함수의 매개변수 T extends new (...args: infer P) => any [string, number]
ReturnType<T> 함수의 반환값 T extends (...args: any) => infer R Promise<string>
InstanceType<T> 생성자의 인스턴스 타입 T extends new (...args: any) => infer R Person

 

'Typescript' 카테고리의 다른 글

forEach 만들기  (0) 2025.04.29
ThisType  (0) 2025.04.12
Exclude, Extract, Omit, NonNullable  (0) 2025.04.12
Partial, Required, Readonly, Pick, Record  (1) 2025.04.12
앰비언트 선언도 선언 병합이 된다  (0) 2025.04.11