==== tests/cases/conformance/expressions/functionCalls/overloadResolutionClassConstructors.ts (18 errors) ==== 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; } // Ambiguous call picks the first overload in declaration order class fn1 { constructor(s: string); constructor(s: number); constructor() { } } new fn1(undefined); // No candidate overloads found new fn1({}); // Error ~~ !!! Argument of type '{}' is not assignable to parameter of type 'number'. // Generic and non - generic overload where generic overload is the only candidate when called with type arguments class fn2 { constructor(s: string, n: number); constructor(n: number, t: T); constructor() { } } var d = new fn2(0, undefined); // 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); // OK // 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 class fn3 { constructor(n: T); constructor(s: string, t: T, u: U); constructor(v: V, u: U, t: T); constructor() { } } new fn3(3); new fn3('', 3, ''); new fn3(5, 5, 5); // Generic overloads with differing arity called with type arguments matching each overload type parameter count new fn3(4); // Error ~~~~~~~~~~~~~~~~~~ !!! Supplied parameters do not match any signature of call target. new fn3('', '', ''); // Error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! Supplied parameters do not match any signature of call target. new fn3('', '', 3); // Generic overloads with differing arity called with type argument count that doesn't match any overload new fn3(); // Error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! Supplied parameters do not match any signature of call target. // Generic overloads with constraints called with type arguments that satisfy the constraints class fn4 { constructor(n: T, m: U); constructor() { } } new fn4('', 3); new fn4(3, ''); // Error ~ !!! Argument of type 'number' is not assignable to parameter of type 'string'. new fn4('', 3); // Error ~~~~~~ !!! Type 'number' does not satisfy the constraint 'string'. ~~~~~~ !!! Type 'string' does not satisfy the constraint 'number'. ~~ !!! Argument of type 'string' is not assignable to parameter of type 'number'. new fn4(3, ''); // Error ~~~~~~ !!! Type 'number' does not satisfy the constraint 'string'. ~~~~~~ !!! Type 'string' does not satisfy the constraint 'number'. // Generic overloads with constraints called without type arguments but with types that satisfy the constraints new fn4('', 3); new fn4(3, ''); // Error ~ !!! Argument of type 'number' is not assignable to parameter of type 'string'. new fn4(3, undefined); // Error ~ !!! Argument of type 'number' is not assignable to parameter of type 'string'. new fn4('', null); // Generic overloads with constraints called with type arguments that do not satisfy the constraints new fn4(null, null); // Error ~~~~~~~ !!! Type 'boolean' does not satisfy the constraint 'string'. ~~~~ !!! Type 'Date' does not satisfy the constraint 'number'. // Generic overloads with constraints called without type arguments but with types that do not satisfy the constraints new fn4(true, null); // Error ~~~~ !!! Argument of type 'boolean' is not assignable to parameter of type 'string'. new fn4(null, true); // Error ~~~~ !!! Argument of type 'boolean' is not assignable to parameter of type 'number'. // Non - generic overloads where contextual typing of function arguments has errors class fn5 { constructor(f: (n: string) => void); constructor(f: (n: number) => void); constructor() { return undefined; } } new fn5((n) => n.toFixed()); ~~~~~~~ !!! Property 'toFixed' does not exist on type 'string'. new fn5((n) => n.substr(0)); new fn5((n) => n.blah); // Error ~~~~ !!! Property 'blah' does not exist on type 'string'.