C.W.K.
Stream
Lesson 07 of 07 · published

`infer`: 다른 타입에서 타입 끄집어내기

~11 min · generics, infer, conditional-types, type-extraction

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"`infer` 가 pattern match 에서 타입 캡처. Compiler 가 모양 읽고 slot 묶음."

`infer` 가 뭐 함

`infer` 가 conditional 타입의 `extends` 절 안에서만 쓰이는 keyword. Match 되는 pattern 의 일부 캡처하는 타입 변수 선언. T extends Array<infer E> ? E : never 말함: "T 가 어떤 `Array` 면, E 를 그 element 타입으로 설정; 아니면 never."

이게 타입-레벨 destructuring 버전. Pattern 쓰고, `infer X` 가 그 위치에 있던 거 캡처하는 binding.

Canonical 사용

배열의 element: type ElementOf<T> = T extends (infer E)[] ? E : never. 배열의 element 타입 추출.

함수의 return 타입: type ReturnOf<F> = F extends (...args: any[]) => infer R ? R : never. Standard library 의 `ReturnType` 이 정확히 이거.

Promise 된 타입: type Unwrap<T> = T extends Promise<infer V> ? V : T. Promise 에서 값 추출.

첫 argument: type FirstArg<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never. 첫 parameter 타입 끄집어냄.

왜 `infer` 중요

`infer` 없으면, 타입의 모양 체크 가능 (`T extends Array`) 하지만 새 정보 못 얻어. `infer` 가 conditional 타입을 yes/no 질문에서 변수 묶는 pattern match 로 바꿈. '배열이야?' 와 'element 타입 뭐야?' 의 차이.

이게 타입-레벨 프로그래밍의 관문. 다른 타입에서 타입 추출 가능하면, 합성 가능, 변환 가능, 정교한 derived 타입 빌드 가능 — 다 runtime 작업 없이.

`infer` + conditional 타입 + generic 이 타입-레벨 계산의 전체 toolkit. 야생의 대부분 고급 TypeScript 패턴이 이 셋의 조합.

Code

Canonical infer 패턴 4개·typescript
// Canonical 4개 `infer` 패턴.

// 1. 배열의 element.
type ElementOf<T> = T extends (infer E)[] ? E : never;
type A = ElementOf<string[]>;        // string
type B = ElementOf<User[]>;          // User

// 2. 함수의 return 타입.
type ReturnOf<F> = F extends (...a: any[]) => infer R ? R : never;
type C = ReturnOf<() => string>;     // string
type D = ReturnOf<typeof JSON.parse>;// any (JSON.parse 가 any 반환)

// 3. Promise unwrap.
type Unwrap<T> = T extends Promise<infer V> ? V : T;
type E = Unwrap<Promise<User>>;      // User
type F = Unwrap<User>;               // User (non-Promise 통과)

// 4. 함수의 첫 argument.
type FirstArg<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never;
type G = FirstArg<(x: number, y: string) => void>;  // number

External links

Exercise

함수 타입에서 parameter 타입의 tuple 추출하는 type ParametersOf<F> 써. ParametersOf<(a: number, b: string) => void>[number, string] 이어야. infer 써서 rest parameter 캡처.
Hint
type ParametersOf<F> = F extends (...args: infer P) => any ? P : never. ...args: infer P 가 전체 parameter tuple 한 번에 캡처.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.