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