PART 06. 제네릭 — 타입의 함수
타입 자체를 매개변수로 만들어, 한 번 작성한 코드가 어떤 타입에도 동작하도록 합니다.
PART 05에서는 TypeScript가 코드를 읽으며 타입을 좁혀가는 원리를 배웠습니다. if 문 하나로 string | number에서 string을 골라내고, 판별 유니온으로 복잡한 분기를 정리했습니다. TypeScript가 얼마나 똑똑한지 실감했을 겁니다.
이제 한 단계 더 나아갑니다. 지금까지는 구체적인 타입을 미리 정해놓고 코드를 작성했습니다. string을 받는 함수, number를 받는 함수, User를 받는 함수처럼요. 그런데 같은 로직인데 타입만 달라서 코드를 여러 번 작성해야 하는 상황을 만나면 어떻게 할까요?
제네릭은 이 문제에 대한 TypeScript의 답입니다. 타입을 미리 정하지 않고, 나중에 사용하는 시점에 정하게 합니다. 마치 함수가 매개변수로 값을 받는 것처럼, 제네릭은 타입을 매개변수로 받습니다.
이 파트는 이 책에서 가장 어려운 구간입니다. 하지만 일단 제네릭의 감을 잡으면, 지금까지 작성하던 코드가 얼마나 더 강력해지는지 느낄 수 있습니다.
이 파트에서는 다음 내용을 다룹니다.
- Ch 01. 왜 제네릭이 필요한가:
any를 쓰면 안 되는 이유와 같은 로직 다른 타입 문제를 살펴봅니다. 만능 상자의 비유로 제네릭이 왜 필요한지 납득합니다. - Ch 02. 제네릭 함수 만들기:
<T>문법으로 타입 매개변수를 선언하고, 호출 시 타입이 자동으로 추론되는 원리를 배웁니다. - Ch 03. 제네릭에 제약 걸기:
extends로 타입 매개변수의 범위를 제한하고,keyof와 조합하여 객체 속성에 안전하게 접근하는 방법을 배웁니다. - Ch 04. 유틸리티 타입 활용하기: TypeScript가 기본으로 제공하는
Partial,Required,Pick,Omit,Record등의 도구를 배웁니다. 이것들도 제네릭으로 만들어진 타입입니다. - Ch 05. 제네릭으로 재사용 가능한 코드 만들기: 제네릭 인터페이스와 클래스를 활용하여 실전에서 쓰이는
ApiResponse<T>,Repository<T>같은 패턴을 만들어봅니다.
이 파트를 마치면 "같은 로직인데 타입만 다르다"는 이유로 코드를 반복하지 않아도 됩니다. 한 번 잘 만든 제네릭 함수나 클래스가 어떤 타입에도 안전하게 동작합니다.
조건부 타입(Conditional Types)과 infer 키워드 같은 고급 제네릭 주제는 "실전 TypeScript"에서 다룹니다.