overload dispatch

오버로드와 구현 본문

TypeScript는 호출 인자에 맞는 오버로드 시그니처를 먼저 고르고, 실제 JavaScript 실행은 하나의 구현 시그니처 본문으로 들어갑니다.

1 호출부

인자 타입 수집

getLength(["a", "b"])

호출식의 인자 목록과 문맥 타입을 기준으로 후보 탐색을 시작합니다.

2 후보군

오버로드만 검사

구현 시그니처는 호출 가능한 API 표면이 아니므로 후보에서 빠집니다.

3 호환 선택

순서대로 맞춤

더 구체적인 시그니처가 먼저 있으면 의도한 반환 타입을 얻기 쉽습니다.

4 구현부

하나의 본문 실행

런타임에서는 타입 가드로 실제 값의 형태를 좁혀 분기합니다.

overload 1

input: string → number

문자열 호출을 위한 공개 계약입니다.

getLength(input: string): number; call "hello"만 호환
selected

input: string[] → number

배열 호출과 호환되므로 이 시그니처의 반환 타입이 노출됩니다.

getLength(input: string[]): number; call ["a", "b"]와 호환
not exposed

input: string | string[]

구현용 타입은 넓지만 호출부의 후보 시그니처로 쓰이지 않습니다.

getLength(input: string | string[]): number body를 가진 실제 함수

implementation body

function getLength( input: string | string[] ): number { if (typeof input === "string") return input.length; return input.length; }
OK 포괄성

구현 시그니처는 모든 오버로드 인자를 받을 수 있어야 합니다.

점검 반환 관계

각 오버로드의 반환 타입과 실제 반환 경로가 어긋나지 않아야 합니다.

ERROR 누락 후보

number 호출처럼 공개 오버로드가 없으면 구현이 넓어도 호출은 실패합니다.

TIP 제네릭 예외

관계가 단순하면 overload보다 T, Promise<T> 같은 제네릭이 낫습니다.