프로그래밍백엔드 개발자

타입스크립트 클래스에서 메서드 오버로드를 구현하려면 어떻게 해야 하며, 오버로드 메서드를 작성할 때 피해야 할 오류는 무엇이며, 타입을 고려할 때 어떤 세부사항을 주의해야 할까요?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사:

타입스크립트는 자바나 C#과 같은 다른 엄격한 타입 언어와 유사하게 메서드 오버로드를 지원하지만, 타입스크립트의 오버로드 문법은 개념적으로 다릅니다. 여러 시그니처가 허용되지만, 단 하나의 구현만 허용됩니다. 이로 인해 전통적인 오버로드에 익숙한 개발자들에게 혼란을 초래할 수 있습니다.

문제:

일반적인 오류는 서로 다른 매개변수 집합을 가진 여러 메서드를 정의하려고 시도하는 것입니다. 이로 인해 컴파일 오류가 발생하는데, 타입스크립트는 모든 시그니처 변형을 구현하는 하나의 구현을 요구하기 때문입니다.

해결책:

오버로드는 여러 메서드 시그니처를 선언한 후, 모든 경우에 맞는 구현을 제공함으로써 달성됩니다. 올바른 매개변수 구별을 위해 일반적으로 타입 가드 또는 instanceof를 사용합니다.

코드 예:

class MyLogger { log(message: string): void; log(message: string, level: 'info' | 'error'): void; log(message: string, level?: 'info' | 'error'): void { const lvl = level ?? 'info'; console.log(`[${lvl}] ${message}`); } }

주요 특징:

  • 하나의 메서드 구현만 가능하지만, 여러 선언-시그니처가 있음
  • 구현 내에서 모든 입력 매개변수 변형을 처리해야 함
  • 구현의 타입은 최대한 넓게 설정해야 함

장난스러운 질문들.

매개변수 집합이 다른 하나의 메서드에 대해 두 개의 구현을 할 수 있나요?

아니요. 타입스크립트에서는 하나의 구현만 허용됩니다. 동일한 이름을 가진 여러 메서드는 문법 오류입니다.

오버로드 메서드에서 rest 매개변수를 어떻게 타입 지정하여 엄격한 타입을 손실하지 않나요?

시그니처에서 정확한 매개변수를 설명하고 구현에서는 최대한 일반화된 매개변수를 사용하는 것이 좋습니다:

class Test { doWork(a: number): void; doWork(a: string): void; doWork(a: number | string): void { //... } }

오버로드된 시그니처의 반환 타입이 다르면 어떻게 되나요?

타입스크립트는 구현이 결합된 타입(Union)을 반환하도록 요구합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

class X { get(value: number): string; get(value: string): number; get(value: number | string): string | number { return typeof value === 'number' ? 'number' : 42; } }

일반적인 오류 및 안티패턴

  • 구현이 오버로드 시그니처와 일치하지 않음
  • 동일한 메서드에 대해 여러 개별 구현
  • 메서드 본문에서 입력 매개변수 타입 검사를 무시함

실제 사례

부정적인 케이스

제품에서 서로 다른 타입의 매개변수에 대해 동일한 이름의 두 메서드를 구현하려 했습니다. 컴파일 후 메서드 "덮어쓰기"가 마지막 선언으로 일어났고, 나머지 버전은 무시되어 버그가 발생했습니다.

장점:

  • 일부 언어에서 익숙한 스타일

단점:

  • 타입스크립트에서는 완전히 작동하지 않음, 컴파일 오류 발생
  • 케이스 누락의 위험 증가

긍정적인 케이스

유니온 타입 매개변수를 가진 여러 시그니처를 만들고, 메서드에서 모든 변형을 타입 가드를 통해 처리했습니다. 컴파일러는 즉시 타입 문제에 대해 경고했습니다.

장점:

  • 엄격한 타입 검사
  • 안전성
  • 테스트 용이성

단점:

  • 변형 검증을 위해 더 많은 코드 필요