제네릭 함수

타입 정보 보존

제네릭 함수의 핵심은 any처럼 정보를 버리는 것이 아니라 호출 시점에 정해진 타입을 매개변수, 반환값, 객체 키 접근까지 이어 붙이는 것이다.

호출

값이 들어온다

`identity("hello")`처럼 인자의 실제 타입을 본다.

추론

T가 정해진다

문자열이면 T는 string, 숫자면 T는 number가 된다.

적용

함수 전체에 반영

매개변수와 반환 타입의 T가 같은 실제 타입으로 치환된다.

사용

메서드 접근 안전

반환값이 string이면 length, number이면 toFixed를 쓸 수 있다.

타입 보존

입력 타입과 반환 타입을 같은 T로 연결

function identity<T>(arg: T): T {
  return arg;
}

const name = identity("TypeScript");
const count = identity(3);
          

any를 쓰면 반환 타입을 잃지만, T를 쓰면 호출별 타입이 그대로 살아 있다.

extends

필요한 구조만 제한

`T extends Lengthwise`는 length 속성이 있는 값만 허용하므로 함수 내부에서 `arg.length`에 안전하게 접근한다.

허용 안 됨

조건 없는 타입은 속성 접근 불가

T가 어떤 타입인지 모르면 number처럼 length가 없는 값도 들어올 수 있어, 제약 없이 `arg.length`를 사용할 수 없다.

T1, T2

여러 타입 변수

`pair<T1, T2>`는 서로 다른 두 타입을 튜플에 그대로 보존한다.

keyof T

객체 키 유니온

객체가 가진 키 이름만 모아 `"name" | "age"`처럼 제한한다.

K extends

안전한 속성 선택

`getProperty`는 존재하는 키만 받으므로 잘못된 속성 접근을 막는다.

설계 결론

넓게 받되, 정보는 좁게 보존한다

제네릭은 함수 하나를 여러 타입에서 쓰게 해주지만, 타입 변수와 제약 조건을 통해 호출부가 얻는 타입 정보는 구체적으로 유지한다.