[typescript] 제네릭 제약 조건을 사용하여 특정 타입에만 제네릭을 적용하는 방법

TypeScript에서 제네릭을 사용할 때, 특정 타입에만 제네릭을 제약하는 것이 유용한 경우가 있습니다. 이를 위해 제네릭 제약 조건을 사용할 수 있습니다. 제네릭 제약을 사용하면, 특정 타입에 해당하는 메서드나 속성을 사용할 수 있으며, 다른 타입에서는 제네릭이 적용되지 않도록 할 수 있습니다.

다음은 TypeScript에서 제네릭 제약을 사용하여 특정 타입에만 제네릭을 적용하는 방법에 대한 예제 코드입니다.

// 인터페이스에 extends 키워드를 사용하여 제네릭 제약을 추가
interface Printable {
  print(): void;
}

// Printer 클래스에 제네릭 T를 사용하고, 제네릭 제약으로 Printable을 지정
class Printer<T extends Printable> {
  constructor(private value: T) {}

  // 제네릭으로 지정된 타입에 속하는 print 메서드를 호출
  printValue(): void {
    this.value.print();
  }
}

// 제네릭으로 지정된 타입이 Printable을 구현해야 함
class Document implements Printable {
  print(): void {
    console.log("Document is printed");
  }
}

// 제네릭으로 지정된 타입이 Printable을 구현하지 않았으므로 에러 발생
class Car {
  drive(): void {
    console.log("Car is being driven");
  }
}

const documentPrinter = new Printer(new Document());
documentPrinter.printValue(); // Output: Document is printed

// 아래 코드는 에러가 발생합니다. Car 클래스는 Printable을 구현하지 않았기 때문에 제네릭 제약에 위배됩니다.
// const carPrinter = new Printer(new Car());

위 예제에서는 Printer 클래스에 제네릭 T를 사용하고, 제네릭 제약으로 Printable 인터페이스를 지정했습니다. 이를 통해 printValue 메서드에서는 제네릭으로 지정된 타입이 Printable 인터페이스를 구현한 경우에만 print 메서드를 호출할 수 있습니다.

제네릭을 사용하여 코드를 보다 유연하게 작성하고, 타입 안정성을 확보하는 데 제네릭 제약이 유용하게 활용될 수 있습니다.

더 많은 정보는 TypeScript 공식 문서를 참고할 수 있습니다.