function makeDate(timestamp: number): Date; // 1
function makeDate(m: number, d: number, y: number): Date; // 2
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date { // 3
if (d !== undefined && y !== undefined) {
return new Date(y, mOrTimestamp, d);
} else {
return new Date(mOrTimestamp);
}
}
const d1 = makeDate(12345678);
const d2 = makeDate(5, 5, 5);
const d3 = makeDate(1, 3); // err
// No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.
-> No overload = 맨 위의 두 makeDate 함수
-> overload = 세번째 makeDate 함수
overload 함수의 개념은 No overload 함수들로 narrowing을 하는 것이다.
위의 경우
1 번 함수는 인자를 1 개 받고 number type을 받는다
2 번 함수는 인자를 3 개 받고 모두 number type을 받는다
overload 함수는 인자를 통해 1 ~ 2 중 하나의 함수를 선택해 함수의 내부 동작을 실행시킨다.
function len(s:string):number;
function len(arr:any[]):number;
function len(x:any){
return x.length;
}
console.log(len("weqwew"));
console.log(len([1,2,3]));
console.log(len(Math.random() > 0.5 ? "hello" : [0]); // err
위의 함수는 잘 짜여진 overload 함수이다.
하지만 마지막 함수 호출에서 에러를 일으키게 된다.
No overload matches this call. Overload 1 of 2, '(s: string): number', gave the following error. Argument of type 'number[] | "hello"' is not assignable to parameter of type 'string'. Type 'number[]' is not assignable to type 'string'.
에러를 일으키는 이유는 3 번째 함수 호출 때문이다.
len 함수는 위에 선언된 no overload 함수 중 어떤 것인지를 선택해야 하지만
number[] | string 을 인자로 받는 no overload 함수가 없기 때문에 에러를 일으키게 된다.
function len(x: any[] | string) {
return x.length;
}
이런식으로 설정해주도록 하자.