개발새발
Parameters, Constructorparameters, ReturnType, InstanceType 본문
타입스크립트의 고급 타입 기능 중에서도 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 |