From bd84179d82b4551981d7af142bae1fde4f9f1fcb Mon Sep 17 00:00:00 2001 From: Matt McCutchen Date: Tue, 17 Jul 2018 13:25:46 -0400 Subject: [PATCH] Check for optional type parameters before issuing a "wrong number of type arguments" error on a function call. Fixes #25683. --- src/compiler/checker.ts | 2 +- .../overloadsAndTypeArgumentArityErrors.errors.txt | 11 +++++++++-- .../reference/overloadsAndTypeArgumentArityErrors.js | 7 ++++++- .../overloadsAndTypeArgumentArityErrors.symbols | 9 +++++++++ .../overloadsAndTypeArgumentArityErrors.types | 10 ++++++++++ .../compiler/overloadsAndTypeArgumentArityErrors.ts | 5 ++++- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e59641bed412e..634fc1eb0bdca 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19083,7 +19083,7 @@ namespace ts { else if (candidateForTypeArgumentError) { checkTypeArguments(candidateForTypeArgumentError, (node as CallExpression | TaggedTemplateExpression).typeArguments!, /*reportErrors*/ true, fallbackError); } - else if (typeArguments && every(signatures, sig => length(sig.typeParameters) !== typeArguments!.length)) { + else if (typeArguments && every(signatures, sig => typeArguments!.length < getMinTypeArgumentCount(sig.typeParameters) || typeArguments!.length > length(sig.typeParameters))) { diagnostics.add(getTypeArgumentArityError(node, signatures, typeArguments)); } else if (args) { diff --git a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.errors.txt b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.errors.txt index 45a5616d188ff..06cfb68d9070a 100644 --- a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.errors.txt +++ b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.errors.txt @@ -1,9 +1,10 @@ tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(5,11): error TS2558: Expected 0-2 type arguments, but got 3. tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,1): error TS2350: Only a void function can be called with the 'new' keyword. tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,15): error TS2558: Expected 0-2 type arguments, but got 3. +tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(9,1): error TS2554: Expected 1 arguments, but got 0. -==== tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts (3 errors) ==== +==== tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts (4 errors) ==== declare function Callbacks(flags?: string): void; declare function Callbacks(flags?: string): void; declare function Callbacks(flags?: string): void; @@ -15,4 +16,10 @@ tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,15): error TS2558: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2350: Only a void function can be called with the 'new' keyword. ~~~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2558: Expected 0-2 type arguments, but got 3. \ No newline at end of file +!!! error TS2558: Expected 0-2 type arguments, but got 3. + + declare function f(arg: number): void; + f(); // wrong number of arguments (#25683) + ~~~~~~~~~~~ +!!! error TS2554: Expected 1 arguments, but got 0. + \ No newline at end of file diff --git a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.js b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.js index 1117bc43e1a40..413f262d0445d 100644 --- a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.js +++ b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.js @@ -4,8 +4,13 @@ declare function Callbacks(flags?: string): void; declare function Callbacks(flags?: string): void; Callbacks('s'); // wrong number of type arguments -new Callbacks('s'); // wrong number of type arguments +new Callbacks('s'); // wrong number of type arguments + +declare function f(arg: number): void; +f(); // wrong number of arguments (#25683) + //// [overloadsAndTypeArgumentArityErrors.js] Callbacks('s'); // wrong number of type arguments new Callbacks('s'); // wrong number of type arguments +f(); // wrong number of arguments (#25683) diff --git a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.symbols b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.symbols index 02762f89ba253..80daa049a3e05 100644 --- a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.symbols +++ b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.symbols @@ -20,3 +20,12 @@ Callbacks('s'); // wrong number of type arguments new Callbacks('s'); // wrong number of type arguments >Callbacks : Symbol(Callbacks, Decl(overloadsAndTypeArgumentArityErrors.ts, 0, 0), Decl(overloadsAndTypeArgumentArityErrors.ts, 0, 49), Decl(overloadsAndTypeArgumentArityErrors.ts, 1, 52)) +declare function f(arg: number): void; +>f : Symbol(f, Decl(overloadsAndTypeArgumentArityErrors.ts, 5, 44)) +>A : Symbol(A, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 19)) +>B : Symbol(B, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 21)) +>arg : Symbol(arg, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 30)) + +f(); // wrong number of arguments (#25683) +>f : Symbol(f, Decl(overloadsAndTypeArgumentArityErrors.ts, 5, 44)) + diff --git a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.types b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.types index 409cdb91c9ed3..f6630120e7e79 100644 --- a/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.types +++ b/tests/baselines/reference/overloadsAndTypeArgumentArityErrors.types @@ -24,3 +24,13 @@ new Callbacks('s'); // wrong number of type arguments >Callbacks : { (flags?: string): void; (flags?: string): void; (flags?: string): void; } >'s' : "s" +declare function f(arg: number): void; +>f : (arg: number) => void +>A : A +>B : B +>arg : number + +f(); // wrong number of arguments (#25683) +>f() : any +>f : (arg: number) => void + diff --git a/tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts b/tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts index 7fcc893434ed7..e8f93a86fd756 100644 --- a/tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts +++ b/tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts @@ -3,4 +3,7 @@ declare function Callbacks(flags?: string): void; declare function Callbacks(flags?: string): void; Callbacks('s'); // wrong number of type arguments -new Callbacks('s'); // wrong number of type arguments \ No newline at end of file +new Callbacks('s'); // wrong number of type arguments + +declare function f(arg: number): void; +f(); // wrong number of arguments (#25683)