클래스의 제네릭 또한 앞에서 봤던 함수에서의 제네릭과 크게 다르지 않다. 아래와 같은 클래스가 있다고 가정해본다.
class DataStorage {
private data = [];
addItem(item) {
this.data.push(item);
}
removeItem(item) {
this.data.splice(this.data.indexOf(item), 1);
}
getItems() {
return [...this.data];
}
}
메소드의 모든 매개변수에는 아래와 같은 오류가 나는것을 볼 수 있다
'item' 매개 변수에는 암시적으로 'any' 형식이 포함됩니다.ts(7006)
클래스에서의 제네릭 선언 특징은 세가지가 있다.
위 특징들중 1,2번부터 살펴본다. 가장 기본적으로 클래스 전체에 대해 타입을 선언하기 위해서는 클래스 선언문에 제네릭을 선언해주면 된다
class DataStorage<T>{}
이를 적용해 클래스를 재작성해본다.
class DataStorage<T> {
private data: T[] = [];
addItem(item: T) {
this.data.push(item);
}
removeItem(item: T) {
this.data.splice(this.data.indexOf(item), 1);
}
getItems() {
return [...this.data];
}
}
2번 특징을 살펴보기 위해(억지지만) 사용자에게 메세지를 입력받아 배열이 합쳐진 형태의 문자열을 반환한다 가정해본다.
public printMessage<U>(msg: U): string {
return `${msg} ${this.data}`;
}
정적메소드의 경우에는 클래스 수준의 제네릭을 사용할 수 없다고 했다. 이말은 즉, 클래스 수준에 선언된 제네릭과 정적메소드에 선언된 제네릭 변수가 동일한 이름을 가졌더라도 서로 다른 제네릭 타입이라는 것이다.
class DataStorage<T> {
private data: T[] = [];
static testStaticMethod<T>(msg: T): T {
return msg;
}
...
}
const d1 = new DataStorage<number>();
DataStorage.testStaticMethod<string>("different generic");