TypeScript

타입스크립트 제너릭 과 인터페이스 응용

하림회사 2023. 10. 17. 02:14

Generic과 Interface

Generic의 제약 조건 및 Interface 확장을 이용해 풀 수 있는 문제입니다.

문제에서 Player 클래스의 인스턴스를 생성하고, 메소드를 호출하는 부분을 살펴보겠습니다.

const player = new Player<IVideo>();
player.openFile({title: '타입스크립트', runningTime: 60, extention: 'MPEG'});
player.play();

player 객체에 Generic으로 IVideo를 넘겨주고 있는 것을 볼 수 있습니다. 하지만 작성되어 있는 코드에서는 Player 클래스의 Generic에서 string을 사용하도록 제약 조건이 걸려있어, 이를 IVideo로 수정합니다.

class Player<T extends IVideo> {
  ...

그리고 IVideo Interface에는 없는 titel이나 runningTime 속성을 사용하고 있는데, 이는 IFile Interface에 존재하는 것입니다. 따라서 IVideo에서 이를 상속하여 사용할 수 있도록 작성해주면 끝입니다.

interface IVideo extends IFile {
  ...

다만 현재 Player 클래스에서 Generic으로 사용하는 타입에 대해 IVideo 타입으로 반드시 제약 조건이 필요한 것은 아니기 때문에, 그냥 제약 조건을 제거해도 됩니다.

class Player<T> {
  ...

하지만 만약 아래와 같은 메소드가 클래스에 포함되었다면, 반드시 IVideo 타입으로 제약 조건이 필요합니다.

  printTitle(): void {
    console.log(this.file.title);
  }

답안 코드

interface IFile {
  title: string
  runningTime: number    
}

// interface를 확장해주세요.
interface IVideo extends IFile{
  extention: string
}

// Genric 제약조건을 변경해주세요.
class Player<T extends IVideo> {
  private file: T;
  
  openFile(file: T): void {
    this.file = file;
  }
     
  play(): void {
    console.log(this.file);
  }
}

// 아래 코드는 수정을 하지 않습니다. 
const player = new Player<IVideo>();
player.openFile({title: '타입스크립트', runningTime: 60, extention: 'MPEG'});
player.play();