[TypeScript] Generics (2)

Hoplin·2023년 7월 1일
0
post-thumbnail

클래스에서의 Generics

클래스의 제네릭 또한 앞에서 봤던 함수에서의 제네릭과 크게 다르지 않다. 아래와 같은 클래스가 있다고 가정해본다.

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. 메소드 자체적으로 제네릭 선언 : 클래스 수준의 제네릭
  3. 정적메소드에서 선언된 제네릭은 클래스 수준의 제네릭을 사용할 수 없으며, 별도의 제네릭을 선언해 주어야 한다.

위 특징들중 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");
profile
더 나은 내일을 위해 오늘의 중괄호를 엽니다

0개의 댓글