함수와 타입 처럼 클래스와 인터페이스도 기본값과 상한/하한 설정을 포함한
다양한 제네릭 타입 매개변수 기능을 지원한다
제네릭 타입의 범위는 클래스나 인터페이스 전체가 될 수도 있고, 특정 메서드가 될 수도 있다
class MyMap<K, V> {
// class 와 함께 제네릭 선언 - 클래스 전체에서 타입 사용 가능 (MyMap의 모든 인스턴스 메서드와 인스턴스 프로퍼티에서 K, V 사용 가능)
constructor(initalKey: K, initalValue: V) {
// constructor 에는 제네릭 선언 불가 (class 레벨에서 사용해야 함)
//..
}
get(key: K): V {
// 클래스로 한정된 제네릭 타입은 클래스 내부 어디서든 사용할 수 있다
// ..
}
set(key: K, value: V) {
// ..
}
merge<k1, v1>(map: MyMap<K1, V1>): MyMap<K |K1, V | V1> {
// 인스턴스 메서드는 클래스 수준 제네릭을 사용할 수 있으며 자신만의 제네릭도 추가로 선언할 수 있다
// ..
}
static of<K, V>(k: K, v: V): MyMap<K, V> {
// 정적 메서드는 변수에 값 수준에서 접근할 수 없듯이
// (정적 메서드는 클래스 수준으로 올라간다)
// 따라서 of 는 자신만의 K와 V를 새로 선언한 것이다
// ..
}
}
// 인터페이스에도 제네릭을 선언할 수 있다
interface MyMap<K, V> {
get(key: K): V
set(key: K, value: V): void
}
함수와 마찬가지로 제네릭에 구체 타입을 명시하거나 타입스크립트가 타입으로 추론하도록 할 수 있다