타입스크립트는 함수에 오버로딩이 있을 때 위에서부터 순서대로 검사합니다.
• a(param)의 경우: errorA의 param이 string | number인데 a의 param은 string이나(첫 번째 오버로딩) number라서(두 번째 오버로딩) 에러가 발생합니다.
• b(p1, p2)의 경우: errorB의 p2가 number | undefined인데 b의 p2는 없거나(첫 번째 오버로딩) number라서(두 번째 오버로딩) 에러가 발생합니다.
오버로딩을 제거하면 에러 메시지가 사라집니다.
function a(param: string | number) {}
function errorA(param: string | number) {
a(param);
}
function b(p1: string, p2?: number) {}
function errorB(p1: string, p2: number | undefined) {
b(p1, p2);
}
유니언이나 옵셔널 매개변수를 활용할 수 있는 경우는 오버로딩을 쓰지 않는 게 좋습니다.