"Constraint 가 'T 가 뭐든, 적어도 이 property 들 가져야 함' 말하는 법."
Constraint 문법
<T extends Constraint> 가 T 를 constraint 에 assignable 하게 요구. 구조 assignment — T 가 적어도 `Constraint` 의 멤버 (호환 타입으로) 가져야 함. 한 번 제약되면 함수/타입 body 안에서 그 멤버 접근 가능, compiler 가 존재 아니까.
Constraint 없으면 T 는 `unknown` 같음 — 전달 가능하지만 어떤 property 도 접근 못 함 (compiler 가 T 가 뭐 가졌는지 모름). Constraint 가 접근 unlock.
Canonical 예시
- Length 가짐:
function len<T extends { length: number }>(x: T): number— string, 배열, `length` 필드 가진 어떤 거든 작동. - Key 가짐:
function get<T, K extends keyof T>(obj: T, key: K): T[K]— K 가 T 의 key 로 제약, return 이 그 key 의 값. - Class 임:
function instantiate<T>(Ctor: new () => T): T— T 가 constructor 가 만드는 거.
Constraint + inference
Compiler 가 T 추론할 때 constraint 고려. `T extends string` 으로 제약하면, inference 가 `number` 못 고름. Constraint 가 T 의 legal 공간 narrow. 자주 함수 호출 더 정확하게 만들어.
Generic T 의 property 접근하는데 compiler 가 불평하면, constraint 필요. Constraint 가 compiler 한테 T 가 보장하는 거 말해, property 접근 안전.