//// [overloadResolutionConstructors.ts] class SomeBase { private n; public s: string; } class SomeDerived1 extends SomeBase { private m; } class SomeDerived2 extends SomeBase { private m; } class SomeDerived3 extends SomeBase { private m; } interface fn1 { new (s: string): string; new (s: number): number; } var fn1: fn1; // Ambiguous call picks the first overload in declaration order var s = new fn1(undefined); var s: string; // No candidate overloads found new fn1({}); // Error // Generic and non - generic overload where generic overload is the only candidate when called with type arguments interface fn2 { new (s: string, n: number): number; new (n: number, t: T): T; } var fn2: fn2; var d = new fn2(0, undefined); var d: Date; // Generic and non - generic overload where generic overload is the only candidate when called without type arguments var s = new fn2(0, ''); // Generic and non - generic overload where non - generic overload is the only candidate when called with type arguments new fn2('', 0); // Error // Generic and non - generic overload where non - generic overload is the only candidate when called without type arguments new fn2('', 0); // OK // Generic overloads with differing arity called without type arguments interface fn3 { new(n: T): string; new(s: string, t: T, u: U): U; new(v: V, u: U, t: T): number; } var fn3: fn3; var s = new fn3(3); var s = new fn3('', 3, ''); var n = new fn3(5, 5, 5); var n: number; // Generic overloads with differing arity called with type arguments matching each overload type parameter count var s = new fn3(4); var s = new fn3('', '', ''); var n = new fn3('', '', 3); // Generic overloads with differing arity called with type argument count that doesn't match any overload new fn3(); // Error // Generic overloads with constraints called with type arguments that satisfy the constraints interface fn4 { new(n: T, m: U); new(n: T, m: U); } var fn4: fn4; new fn4('', 3); new fn4(3, ''); // Error new fn4('', 3); // Error new fn4(3, ''); // Generic overloads with constraints called without type arguments but with types that satisfy the constraints new fn4('', 3); new fn4(3, ''); new fn4(3, undefined); new fn4('', null); // Generic overloads with constraints called with type arguments that do not satisfy the constraints new fn4(null, null); // Error // Generic overloads with constraints called without type arguments but with types that do not satisfy the constraints new fn4(true, null); // Error new fn4(null, true); // Error // Non - generic overloads where contextual typing of function arguments has errors interface fn5 { new(f: (n: string) => void): string; new(f: (n: number) => void): number; } var fn5: fn5; var n = new fn5((n) => n.toFixed()); var s = new fn5((n) => n.substr(0)); //// [overloadResolutionConstructors.js] var __extends = this.__extends || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } __.prototype = b.prototype; d.prototype = new __(); }; var SomeBase = (function () { function SomeBase() { } return SomeBase; })(); var SomeDerived1 = (function (_super) { __extends(SomeDerived1, _super); function SomeDerived1() { _super.apply(this, arguments); } return SomeDerived1; })(SomeBase); var SomeDerived2 = (function (_super) { __extends(SomeDerived2, _super); function SomeDerived2() { _super.apply(this, arguments); } return SomeDerived2; })(SomeBase); var SomeDerived3 = (function (_super) { __extends(SomeDerived3, _super); function SomeDerived3() { _super.apply(this, arguments); } return SomeDerived3; })(SomeBase); var fn1; // Ambiguous call picks the first overload in declaration order var s = new fn1(undefined); var s; new fn1({}); var fn2; var d = new fn2(0, undefined); var d; // Generic and non - generic overload where generic overload is the only candidate when called without type arguments var s = new fn2(0, ''); new fn2('', 0); new fn2('', 0); var fn3; var s = new fn3(3); var s = new fn3('', 3, ''); var n = new fn3(5, 5, 5); var n; // Generic overloads with differing arity called with type arguments matching each overload type parameter count var s = new fn3(4); var s = new fn3('', '', ''); var n = new fn3('', '', 3); new fn3(); var fn4; new fn4('', 3); new fn4(3, ''); new fn4('', 3); new fn4(3, ''); new fn4('', 3); new fn4(3, ''); new fn4(3, undefined); new fn4('', null); new fn4(null, null); new fn4(true, null); new fn4(null, true); var fn5; var n = new fn5(function (n) { return n.toFixed(); }); var s = new fn5(function (n) { return n.substr(0); });