bind<A0, A1, A2, A3, A extends any[], R>(this: new (arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2, arg3: A3): new (...args: A) => R;
bind<AX, R>(this: new (...args: AX[]) => R, thisArg: any, ...args: AX[]): new (...args: AX[]) => R;
}
bind 함수의 오버로딩이 13개나 됩니다. CallableFunction은 호출할 수 있는 함수를 의미하고, NewableFunction은 new를 붙여 호출할 수 있는 함수를 의미합니다. new를 붙여 호출할 수 있는 함수는 클래스를 의미합니다.
왜 이렇게 많은 오버로딩이 필요하게 되었는지 다양한 테스트 사례로 테스트해봅시다.