모든 속성이 리터럴 타입인 Zero와 Nero 인터페이스입니다. type과 race 속성의 타입은 동일한데, name과 age 속성의 타입은 다릅니다. 이럴 때 제네릭(generic)을 사용해서 중복을 제거할 수 있습니다.
interface Person<N, A> {
type: 'human',
race: 'yellow',
name: N,
age: A,
}
interface Zero extends Person<'zero', 28> {}
interface Nero extends Person<'nero', 32> {}
제네릭 표기는 <>로 하며, 인터페이스 이름 바로 뒤에 위치합니다. <> 안에 타입 매개변수(Type Parameter)를 넣으면 됩니다. 서로 다른 부분인 name과 age 속성의 타입을 각각 타입 매개변수 N과 A로 만들었습니다. 선언한 제네릭을 사용할 때는 Person<'zero', 28>과 같이 매개변수에 대응하는 실제 타입 인수(Type Argument)를 넣으면 됩니다. <N, A>로 선언한 것에 <'zero', 28>이 들어가므로 N은 'zero', A는 28이 됩니다. 함수의 매개변수에 호출할 때 넣은 인수가 대응되는 것과 유사합니다.