제네릭의 Hello World

identity 함수는 무엇이 오던 그대로 반환하는 함수 입니다.

function identity(arg: any): any {
    return arg;
}

이렇게 되면 반환 될 때 타입을 잃게 됩니다. 대신에 우리는 무엇이 반환 되는지 표시하기 위해 인수의 타입을 캡처할 방법이 필요합니다. 여기서는 값이 아닌 타입에 적용되는 타입 변수를 사용할 것입니다.

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

이 버전의 함수는 이제 타입을 불문하고 동작하므로 제네릭이라고 할 수 있습니다.

제네릭 타입 변수 작업

identity와 같은 제네릭 함수를 만들 때 컴파일러가 함수 본문에 제네릭 타입화 된 매개변수를 쓰도록 강요합니다. 즉, 이 매개변수들은 실제로 any나 모든 타입이 될 수 있는 것처럼 취급할 수 있게 됩니다.

function loggingIdentity<T>(arg: T): T {
  console.log(arg.length); // 오류: T에는 .length 가 없습니다.
  return arg;
}

어떤 곳에서도 arg가 length 프로퍼티를 가지고 있다는 것이 명시 되어 있지 않습니다.

실제로 T가 아닌 T의 배열에서 동작하도록 의도 했다고 가정해 봅시다.

function loggingIdentity<T>(arg: T[]): T[] {
  console.log(arg.length); // 배열은 .length를 가지고 있습니다. 따라서 오류는 없습니다.
  return arg;
}

제네릭 타입 (Generic Types)

이번 섹션에서는 함수 자체의 타입과 제네릭 인터페이스를 만드는 방법에 대해 살펴보겠습니다.

제네릭 함수의 타입은 함수 선언과 유사하게 타입 매개변수가 먼저 나열되는, 비-제네릭 함수의 타입과 비슷합니다.