Merge pull request #25733 from mattmccutchen/issue-25683

Check for optional type parameters before issuing a "wrong number of type arguments" error on a function call.
This commit is contained in:
Mohamed Hegazy 2018-07-17 12:51:19 -07:00 committed by GitHub
commit 57a72f507d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 5 deletions

View File

@ -19087,7 +19087,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) {

View File

@ -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<T>(flags?: string): void;
declare function Callbacks<T1, T2>(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.
!!! error TS2558: Expected 0-2 type arguments, but got 3.
declare function f<A, B = {}>(arg: number): void;
f<number>(); // wrong number of arguments (#25683)
~~~~~~~~~~~
!!! error TS2554: Expected 1 arguments, but got 0.

View File

@ -4,8 +4,13 @@ declare function Callbacks<T>(flags?: string): void;
declare function Callbacks<T1, T2>(flags?: string): void;
Callbacks<number, string, boolean>('s'); // wrong number of type arguments
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
declare function f<A, B = {}>(arg: number): void;
f<number>(); // 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)

View File

@ -20,3 +20,12 @@ Callbacks<number, string, boolean>('s'); // wrong number of type arguments
new Callbacks<number, string, boolean>('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<A, B = {}>(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<number>(); // wrong number of arguments (#25683)
>f : Symbol(f, Decl(overloadsAndTypeArgumentArityErrors.ts, 5, 44))

View File

@ -24,3 +24,13 @@ new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
>Callbacks : { (flags?: string): void; <T>(flags?: string): void; <T1, T2>(flags?: string): void; }
>'s' : "s"
declare function f<A, B = {}>(arg: number): void;
>f : <A, B = {}>(arg: number) => void
>A : A
>B : B
>arg : number
f<number>(); // wrong number of arguments (#25683)
>f<number>() : any
>f : <A, B = {}>(arg: number) => void

View File

@ -3,4 +3,7 @@ declare function Callbacks<T>(flags?: string): void;
declare function Callbacks<T1, T2>(flags?: string): void;
Callbacks<number, string, boolean>('s'); // wrong number of type arguments
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
declare function f<A, B = {}>(arg: number): void;
f<number>(); // wrong number of arguments (#25683)