질문의 역사:
타입스크립트는 자바나 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; } }
제품에서 서로 다른 타입의 매개변수에 대해 동일한 이름의 두 메서드를 구현하려 했습니다. 컴파일 후 메서드 "덮어쓰기"가 마지막 선언으로 일어났고, 나머지 버전은 무시되어 버그가 발생했습니다.
장점:
단점:
유니온 타입 매개변수를 가진 여러 시그니처를 만들고, 메서드에서 모든 변형을 타입 가드를 통해 처리했습니다. 컴파일러는 즉시 타입 문제에 대해 경고했습니다.
장점:
단점: