overload 에 대해

YOUNGJOO-YOON·2021년 8월 24일
0

typeScript

목록 보기
36/65

function overloads

= overload 함수를 사용해보자.

개념: function을 narrowing 하는 또 다른 방법


 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;
}

이런식으로 설정해주도록 하자.

profile
이 블로그의 글은 제 생각을 정리한 글과 인터넷 어딘가에서 배운 것을 정리한 글입니다. 출처는 되도록 남기도록 하겠습니다. 수정 및 건의 오류 등이 있으면 언제든지 댓글 부탁드립니다.

0개의 댓글