The bindNew incorrectly infers the constructor type, recognising only one of multiple overloaded version.
How it could be resolved?
function bindNew<C extends { new(...args: A): T }, A extends any[], T>(
klass: C & { new(...args: A): T }
): C & ((...args: A) => T) {
return new Proxy(klass, {
apply(target, _self, args) { return new (target as any)(...args) }
}) as any
}
class AClass {
constructor(a: number)
constructor(a: number, b: number)
constructor(a: number, b?: number) {}
}
const A = bindNew(AClass)
A(0) // => Error: expects 2 arguments
A(0, 0)
// This works, but requires explicit type declaration
// interface A extends AClass {}
// const A = bindNew(AClass) as typeof AClass & {
// (a: number): A
// (a: number, b: number): A
// }