`T`는 호출 시점에 결정되는 타입이므로 아무 조건이 없으면 내부 속성 접근이 제한됩니다.
GENERIC CONSTRAINTS
제네릭 제약은 유연성을 유지하면서 필요한 속성을 보장한다
제네릭은 여러 타입을 받을 수 있지만, 함수 내부에서 특정 속성을 써야 한다면 `extends`로 최소 조건을 선언해야 합니다.
interface Lengthwise { length: number }
function getLength<T extends Lengthwise>(arg:
T)
return arg.length
`T extends Lengthwise`는 length 속성을 가진 값만 통과시키는 컴파일 규칙입니다.
`K extends keyof T`를 쓰면 객체에 실제 존재하는 키만 안전하게 받을 수 있습니다.
제약은 타입을 좁히는 것이 아니라 필요한 조건만 더해 원래 타입 정보를 보존합니다.
통과
문자열, 배열, `{ length: 10 }`처럼 조건을 만족하는 값은 원래
타입을 유지한 채 사용할 수 있습니다.
차단
숫자, boolean, 빈 객체처럼 `length`가 없는 값은 함수 내부 오류가
생기기 전에 컴파일 단계에서 막힙니다.