값이 들어온다
`identity("hello")`처럼 인자의 실제 타입을 본다.
제네릭 함수의 핵심은 any처럼 정보를 버리는 것이 아니라 호출 시점에 정해진 타입을 매개변수, 반환값, 객체 키 접근까지 이어 붙이는 것이다.
`identity("hello")`처럼 인자의 실제 타입을 본다.
문자열이면 T는 string, 숫자면 T는 number가 된다.
매개변수와 반환 타입의 T가 같은 실제 타입으로 치환된다.
반환값이 string이면 length, number이면 toFixed를 쓸 수 있다.
function identity<T>(arg: T): T {
return arg;
}
const name = identity("TypeScript");
const count = identity(3);
any를 쓰면 반환 타입을 잃지만, T를 쓰면 호출별 타입이 그대로 살아 있다.
`T extends Lengthwise`는 length 속성이 있는 값만 허용하므로 함수 내부에서 `arg.length`에 안전하게 접근한다.
T가 어떤 타입인지 모르면 number처럼 length가 없는 값도 들어올 수 있어, 제약 없이 `arg.length`를 사용할 수 없다.
`pair<T1, T2>`는 서로 다른 두 타입을 튜플에 그대로 보존한다.
객체가 가진 키 이름만 모아 `"name" | "age"`처럼 제한한다.
`getProperty`는 존재하는 키만 받으므로 잘못된 속성 접근을 막는다.
제네릭은 함수 하나를 여러 타입에서 쓰게 해주지만, 타입 변수와 제약 조건을 통해 호출부가 얻는 타입 정보는 구체적으로 유지한다.