더북(TheBook)

lib.es5.d.ts

interface CallableFunction extends Function {
  ...
  bind<T, A0, A extends any[], R>(this: (this: T, arg0: A0, ...args: A) => R, thisArg: T, arg0: A0): (...args: A) => R;
  ...
}

add0에 비해 매개변수가 하나 더 추가되었을 뿐인데 타입이 많이 달라졌습니다. ThisParameter TypeOmitThisParameter를 아예 쓰지 않았습니다.

우선 bindthisArgTnull이고, arg0A01입니다. 이러면 자연스럽게 this(this: null, arg0: 1, ...args: A) => R이 됩니다. 여기서 다시 타입 추론하는데요. A는 첫 번째 매개변수를 제외한 나머지 매개변수의 튜플이므로, A[b?: number | undefined, c?: number | undefined, d?: number | undefined, e?: number | undefined]이고 Rnumber라는 사실을 알게 됩니다.

반환값의 타입은 (...args: A) => R이므로 최종적으로 add1(b?: number | undefined, c?: number | undefined, d?: number | undefined, e?: number | undefined) => number 함수가 됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.