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

왜 Generic: Slot 가진 타입

~10 min · generics, intro, type-parameters

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"Generic 은 아직 결정 안 한 타입. Caller 가 slot 채워."

Generic 이 해결하는 문제

배열의 첫 element 반환하는 `first` 함수 쓴다고 상상. Generic 없으면 element 타입마다 하나씩 써 — firstString, firstNumber, firstUser — 또는 `any[]` 받고 `any` 반환, 모든 타입 안전 잃어. 둘 다 나빠.

Generic 이 함수를 call site 에서 캡처되는 unknown 타입으로 parameterize 하게 해서 해결. function first<T>(arr: T[]): T — 한 함수, 한 signature. Compiler 가 argument 에서 T 가 뭔지 알아내고 return 타입까지 thread.

Slot 비유

`` 를 signature 의 slot 으로 생각해. Caller (또는 compiler 가 inference 통해) 가 함수 호출될 때 slot 채워. first([1, 2, 3]) 가 T 를 `number` 로 채움; first(['a', 'b']) 가 T 를 `string` 으로 채움. 두 case 다 같은 함수 코드 돌아; type system 이 차이 추적.

`Array` 가 이거: element 타입에 slot 가진 배열 타입. `Array` 이 `string[]`. `Array<{ id: number }>` 가 object 의 배열. 같은 모양, 다른 채움.

관계-보존 property

Generic 의 killer 기능이 slot 이 signature 전체에 같다는 것. T 가 parameter 와 return 둘 다 나타나면, 호출이 같은 타입이라고 강제. function identity<T>(x: T): T — 너가 넣은 거 그대로 나오고, 타입 보존. 이 관계-추적이 primitive 타입만으론 불가능.

Generic 이 특별한 TypeScript 기능 아냐 — 타입 붙은 collection, 타입 붙은 Promise, 타입 붙은 mapper, 타입 붙은 callback 다 작동하는 법. 모든 Array, 모든 Map, 모든 Promise 가 최소 한 타입 parameter 가짐. Generic 배우는 거 선택 아냐; standard library 가 빚어진 법.

Code

Generic 기본 — slot, 채움, 관계·typescript
// Generic 없이 — 타입 잃음.
function firstLoose(arr: any[]): any {
  return arr[0];
}
const a = firstLoose([1, 2, 3]);   // a: any — 도움 없음

// Generic 과 함께 — 관계 보존.
function first<T>(arr: T[]): T {
  return arr[0];
}
const b = first([1, 2, 3]);        // b: number — 추론
const c = first(['a', 'b']);       // c: string
const d = first<boolean>([true]);  // d: boolean — 명시

// identity — 교과서 generic.
function identity<T>(x: T): T { return x }
const e = identity(42);            // e: number
const f = identity('hi');          // f: string

External links

Exercise

Tuple [T, U] 받고 [U, T] 반환하는 generic swap 함수 써. 함수가 2개 타입 parameter 쓰는 거랑 입력-출력 관계 봐. 그다음 swap([1, 'two'])swap([true, { x: 1 }]) 시도 — return 타입이 기대한 거인지 확인.
Hint
function swap<T, U>(p: [T, U]): [U, T] { return [p[1], p[0]] }. Compiler 가 입력 tuple 에서 T 와 U 추론하고 return 까지 thread.

Progress

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

댓글 0

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

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