TypeScript에서 함수 오버로딩은 서로 다른 타입 및/또는 인자의 수를 가진 여러 함수 시그니처 선언을 통해 이루어지지만, 실제 구현은 하나입니다.
주요 특징: 실제 구현은 항상 하나, 컴파일러는 호출이 선언된 시그니처 중 하나와 일치하는지 검사합니다.
function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `Hello, ${person}. You are ${age}!`; } else { return `Hello, ${person}!`; } } greet('Alice'); // 'Hello, Alice!' greet('Bob', 32); // 'Hello, Bob. You are 32!'
⚠️ C#이나 Java와 달리, 여러 개의 함수 구현이 존재하지 않음 — 모든 시그니처는 하나의 함수로 해결되며 내부에서 필수 검사가 이루어집니다.
TypeScript에서 각 오버로딩된 시그니처를 C#처럼 개별 함수로 구현해야 하나요?
답변: 아니요! TypeScript에서 오버로딩 함수에 대해서는 단 하나의 구현만 존재합니다. 모든 변형은 시그니처 선언 집합을 통해 정의됩니다. 실제 구현은 다양한 입력 매개변수를 내부에서 처리해야 합니다.
이야기
프로젝트에서 개발자가 동일한 이름의 두 함수를 선언하여 Java처럼 오버로딩을 기대했습니다. 결과적으로 마지막으로 정의된 함수만 작동하고 나머지는 "덮여졌습니다". 이는 예기치 않은 오류와 엄청난 리팩토링 시간 소모로 이어졌습니다.
이야기
오버로딩된 함수 구현 내에서 올바른 타입 검사를 구현하지 않았습니다. 함수가 가끔 고객이 예상한 타입과 다른 값을 반환하여, TypeScript가 오버로딩 구현을 검증하지 않기 때문에 오류 포착이 복잡했습니다.
이야기
타입 수준에서만 오버로딩 구현을 사용하고 (시그니처 선언) 런타임 구현과의 호환성을 보장하지 않았습니다 (옵셔널 매개변수 및 내부 처리 부족). 이로 인해 "타입이 유효한" 매개변수로 호출 시 런타임이 이러한 경우를 지원하지 않아 오류가 발생했습니다.