TypeScript제네릭과 타입 조작

제네릭 제약과 keyof

제네릭이 아무 타입이나 받지 않도록 제약을 걸고, 객체 키 집합을 keyof로 안전하게 다루는 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

ts
function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

설명

  • 제네릭 제약은 타입 매개변수에 최소한의 조건을 걸어, 내부에서 안전하게 쓸 수 있게 만드는 장치입니다.
  • 예를 들어 길이가 필요한 함수는 <T extends { length: number }>처럼 제약을 줄 수 있습니다.
  • keyof T는 객체 타입 T의 키들을 literal union으로 뽑아냅니다.
  • 여기에 K extends keyof T를 결합하면, 존재하지 않는 프로퍼티 이름을 실수로 넘기는 일을 컴파일 단계에서 막을 수 있습니다.
  • 이 패턴은 테이블 컬럼 접근, 폼 필드 키, 정렬 기준, 설정 객체 선택처럼 실무 코드에서 아주 자주 등장합니다.

짧은 예제

ts
const user = { id: 1, name: "Ada", active: true };

const name = getProperty(user, "name");
// getProperty(user, "email"); // 타입 오류

빠른 정리

표현역할
<T extends ...>제네릭 최소 조건 지정
keyof TT의 키 집합 추출
K extends keyof TT에 실제로 있는 키만 허용
대표 사용처안전한 프로퍼티 접근, 키 기반 API
장점문자열 오타를 타입 오류로 바꿈

주의할 점

keyof는 강력하지만, 객체 구조가 지나치게 넓거나 string 인덱스 시그니처가 섞이면 기대보다 넓은 키 집합이 나올 수 있습니다. 타입 경계를 너무 느슨하게 두지 않는 편이 좋습니다.

참고 링크

2 sources