더북(TheBook)

add5의 경우 thisArgTnull이고, ...argsAX[](1 | 2 | 3 | 4 | 5)[]로 추론됩니다. 따라서 this(this : null, ...args : (1 | 2 | 3 | 4 | 5)[]) => number인 함수가 되고, bind의 반환값인 add5(...args : (1 | 2 | 3 | 4 | 5)[]) => number 꼴의 함수가 됩니다. 그래서 add5에 인수를 제공할 수 있게 된 것입니다.

그렇다면 왜 add1, add2, add3, add4처럼 타이핑하지 않았을까요? 사실 add1, add2, add3, add4와 똑같이 타이핑하는 게 정확한 타입입니다. 정확한 add5 타입을 만들어보겠습니다.

interface CallableFunction {
  myBind<T, A0, A1, A2, A3, A4, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, arg4: A4, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, arg4: A4): (...args: A) => R;
}
function myAdd(a = 0, b = 0, c = 0, d = 0, e = 0) {
  return a + b + c + d + e;
}
const myAdd5 = myAdd.myBind(null, 1, 2, 3, 4, 5);
myAdd5(5);
// Expected 0 arguments, but got 1.
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.