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

`infer` 패턴: 진지한 타입 마법

~11 min · type-manipulation, infer, advanced, type-extraction

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"`infer` + conditional + mapped 타입이 전체 toolkit. 그것들 compose 할 시간."

이미 아는 거

트랙 8 에서: `infer` 가 conditional pattern 안에서 타입 변수 선언. T extends (infer R)[] ? R : T 가 T 가 배열이면 element 타입 추출. 4개 canonical 패턴 다뤘어: element-of-array, return-of-function, unwrap-promise, first-argument.

이 lesson 이 더 나아가: `infer` 를 mapped 타입, template literal 타입, 재귀 패턴과 결합. 이게 만나게 될 대부분 library 타입 정의 뒤의 기법.

한 pattern 의 여러 infer

같은 pattern 에 여러 infer 변수 선언 가능. T extends [infer A, infer B, ...infer Rest] ? [A, B, Rest] : never 가 tuple 을 첫 두 element 와 나머지로 destructure. 각 infer 가 다른 조각 캡처.

재귀 타입 추출

Conditional 타입이 재귀 가능. type Flatten<T> = T extends (infer E)[] ? Flatten<E> : T 가 배열 재귀적으로 unwrap. Flatten 가 `string` 로 평가. 재귀가 실제 중첩 깊이로 bound — T 가 더 이상 배열 아닐 때 재귀 멈추고 T 반환.

Template literal pattern matching

`infer` 를 template literal 타입과 결합하면 string pattern-match 가능. T extends `${infer A}-${infer B}` ? [A, B] : never 가 'pippa-quest' 를 `['pippa', 'quest']` 로 split. infer 가 literal token 사이 부분 캡처.

전체 toolkit: generic, constraint, conditional, mapped 타입, template literal, infer. 대부분 고급 library 타입이 이것들의 composition. 읽을 수 있게 되면 빌드 가능.

Code

고급 infer 패턴 — 여러, 재귀, template literal·typescript
// 여러 infer — tuple destructuring.
type FirstTwo<T> = T extends [infer A, infer B, ...unknown[]] ? [A, B] : never;
type A = FirstTwo<[1, 2, 3, 4]>;       // [1, 2]

// 재귀 — 중첩 배열 flatten.
type Flatten<T> = T extends (infer E)[] ? Flatten<E> : T;
type B = Flatten<string[][][]>;        // string
type C = Flatten<number>;              // number (base case)

// 재귀 — deep readonly.
type DeepReadonly<T> = {
  readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};

// Template literal + infer — string 타입 split.
type Split<S extends string, D extends string> =
  S extends `${infer Head}${D}${infer Tail}`
    ? [Head, ...Split<Tail, D>]
    : [S];

type D = Split<'a-b-c-d', '-'>;        // ['a', 'b', 'c', 'd']

External links

Exercise

타입 레벨에서 string 뒤집는 type Reverse<T extends string> 써. Reverse<'abc'>'cba' 여야. Template literal infer 와 재귀 써.
Hint
<code>type Reverse<S extends string> = S extends ${infer First}${infer Rest} ? ${Reverse&lt;Rest&gt;}${First} : S</code>. 재귀가 한 글자씩 떼; base case 는 빈 string.

Progress

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

댓글 0

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

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