함수 오버로드(Function Overloads)는 구현 하나 위에 호출 방식별 시그니처를 여러 개 선언해, 인자 조합에 따라 정확한 반환 타입이 추론되게 하는 TypeScript 기능이다.
function add(a: number, b: number): number
function add(a: string, b: string): string
function add(a: number | string, b: number | string) { // 구현 시그니처
return typeof a === 'string' || typeof b === 'string' ? `${a}${b}` : a + b
}
add('Max', ' Kim').split(' ') // 반환이 string으로 추론됨- 구현 시그니처(Implementation Signature)는 밖에서 보이지 않는다. 호출하는 쪽은 위의 오버로드 선언만 본다. 그래서 오버로드는 항상 두 개 이상 둔다
- 인자 개수와 반환 타입이 같다면 오버로드보다 유니언 매개변수 하나가 낫다:
function len(x: string | any[]) - 입력에 따라 반환 타입이 바뀌는 경우는 조건부 타입과 infer로 표현할 수도 있다
- 콜백의 매개변수는, 실제로 인자 없이 부를 일이 없다면 선택적(
?)으로 만들지 않는다
다른 함수 타입 표기
type Fn = (a: string) => void // 함수 타입 표현식(매개변수 이름 필수)
type Describable = { description: string; (n: number): boolean } // call signature: 속성도 가진 함수
type Ctor = { new (s: string): Thing } // construct signature: new로 호출
function filterAdmins(this: User) { return this.admin } // this 매개변수(화살표 함수에선 불가)