기본 패턴
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 T | T의 키 집합 추출 |
K extends keyof T | T에 실제로 있는 키만 허용 |
| 대표 사용처 | 안전한 프로퍼티 접근, 키 기반 API |
| 장점 | 문자열 오타를 타입 오류로 바꿈 |
주의할 점
keyof는 강력하지만, 객체 구조가 지나치게 넓거나 string 인덱스 시그니처가 섞이면
기대보다 넓은 키 집합이 나올 수 있습니다. 타입 경계를 너무 느슨하게 두지 않는 편이 좋습니다.
참고 링크
2 sources