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 Type과 OmitThisParameter를 아예 쓰지 않았습니다.
우선 bind의 thisArg인 T는 null이고, arg0인 A0은 1입니다. 이러면 자연스럽게 this는 (this: null, arg0: 1, ...args: A) => R이 됩니다. 여기서 다시 타입 추론하는데요. A는 첫 번째 매개변수를 제외한 나머지 매개변수의 튜플이므로, A는 [b?: number | undefined, c?: number | undefined, d?: number | undefined, e?: number | undefined]이고 R은 number라는 사실을 알게 됩니다.
반환값의 타입은 (...args: A) => R이므로 최종적으로 add1은 (b?: number | undefined, c?: number | undefined, d?: number | undefined, e?: number | undefined) => number 함수가 됩니다.