Skip to content

Commit bd84179

Browse files
committed
Check for optional type parameters before issuing a "wrong number of
type arguments" error on a function call. Fixes microsoft#25683.
1 parent d9ed917 commit bd84179

6 files changed

+39
-5
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19083,7 +19083,7 @@ namespace ts {
1908319083
else if (candidateForTypeArgumentError) {
1908419084
checkTypeArguments(candidateForTypeArgumentError, (node as CallExpression | TaggedTemplateExpression).typeArguments!, /*reportErrors*/ true, fallbackError);
1908519085
}
19086-
else if (typeArguments && every(signatures, sig => length(sig.typeParameters) !== typeArguments!.length)) {
19086+
else if (typeArguments && every(signatures, sig => typeArguments!.length < getMinTypeArgumentCount(sig.typeParameters) || typeArguments!.length > length(sig.typeParameters))) {
1908719087
diagnostics.add(getTypeArgumentArityError(node, signatures, typeArguments));
1908819088
}
1908919089
else if (args) {

tests/baselines/reference/overloadsAndTypeArgumentArityErrors.errors.txt

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(5,11): error TS2558: Expected 0-2 type arguments, but got 3.
22
tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,1): error TS2350: Only a void function can be called with the 'new' keyword.
33
tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,15): error TS2558: Expected 0-2 type arguments, but got 3.
4+
tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(9,1): error TS2554: Expected 1 arguments, but got 0.
45

56

6-
==== tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts (3 errors) ====
7+
==== tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts (4 errors) ====
78
declare function Callbacks(flags?: string): void;
89
declare function Callbacks<T>(flags?: string): void;
910
declare function Callbacks<T1, T2>(flags?: string): void;
@@ -15,4 +16,10 @@ tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts(6,15): error TS2558:
1516
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1617
!!! error TS2350: Only a void function can be called with the 'new' keyword.
1718
~~~~~~~~~~~~~~~~~~~~~~~
18-
!!! error TS2558: Expected 0-2 type arguments, but got 3.
19+
!!! error TS2558: Expected 0-2 type arguments, but got 3.
20+
21+
declare function f<A, B = {}>(arg: number): void;
22+
f<number>(); // wrong number of arguments (#25683)
23+
~~~~~~~~~~~
24+
!!! error TS2554: Expected 1 arguments, but got 0.
25+

tests/baselines/reference/overloadsAndTypeArgumentArityErrors.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ declare function Callbacks<T>(flags?: string): void;
44
declare function Callbacks<T1, T2>(flags?: string): void;
55

66
Callbacks<number, string, boolean>('s'); // wrong number of type arguments
7-
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
7+
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
8+
9+
declare function f<A, B = {}>(arg: number): void;
10+
f<number>(); // wrong number of arguments (#25683)
11+
812

913
//// [overloadsAndTypeArgumentArityErrors.js]
1014
Callbacks('s'); // wrong number of type arguments
1115
new Callbacks('s'); // wrong number of type arguments
16+
f(); // wrong number of arguments (#25683)

tests/baselines/reference/overloadsAndTypeArgumentArityErrors.symbols

+9
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,12 @@ Callbacks<number, string, boolean>('s'); // wrong number of type arguments
2020
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
2121
>Callbacks : Symbol(Callbacks, Decl(overloadsAndTypeArgumentArityErrors.ts, 0, 0), Decl(overloadsAndTypeArgumentArityErrors.ts, 0, 49), Decl(overloadsAndTypeArgumentArityErrors.ts, 1, 52))
2222

23+
declare function f<A, B = {}>(arg: number): void;
24+
>f : Symbol(f, Decl(overloadsAndTypeArgumentArityErrors.ts, 5, 44))
25+
>A : Symbol(A, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 19))
26+
>B : Symbol(B, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 21))
27+
>arg : Symbol(arg, Decl(overloadsAndTypeArgumentArityErrors.ts, 7, 30))
28+
29+
f<number>(); // wrong number of arguments (#25683)
30+
>f : Symbol(f, Decl(overloadsAndTypeArgumentArityErrors.ts, 5, 44))
31+

tests/baselines/reference/overloadsAndTypeArgumentArityErrors.types

+10
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,13 @@ new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
2424
>Callbacks : { (flags?: string): void; <T>(flags?: string): void; <T1, T2>(flags?: string): void; }
2525
>'s' : "s"
2626

27+
declare function f<A, B = {}>(arg: number): void;
28+
>f : <A, B = {}>(arg: number) => void
29+
>A : A
30+
>B : B
31+
>arg : number
32+
33+
f<number>(); // wrong number of arguments (#25683)
34+
>f<number>() : any
35+
>f : <A, B = {}>(arg: number) => void
36+

tests/cases/compiler/overloadsAndTypeArgumentArityErrors.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@ declare function Callbacks<T>(flags?: string): void;
33
declare function Callbacks<T1, T2>(flags?: string): void;
44

55
Callbacks<number, string, boolean>('s'); // wrong number of type arguments
6-
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
6+
new Callbacks<number, string, boolean>('s'); // wrong number of type arguments
7+
8+
declare function f<A, B = {}>(arg: number): void;
9+
f<number>(); // wrong number of arguments (#25683)

0 commit comments

Comments
 (0)