Skip to content

Commit 7473772

Browse files
authored
Merge pull request microsoft#25938 from Microsoft/fixRestTupleArityCheck
Fix rest tuple arity check
2 parents 2e89dbd + 0758700 commit 7473772

File tree

6 files changed

+113
-5
lines changed

6 files changed

+113
-5
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20132,10 +20132,7 @@ namespace ts {
2013220132
if (pos - paramCount < getLengthOfTupleType(restType)) {
2013320133
return restType.typeArguments![pos - paramCount];
2013420134
}
20135-
const tupleRestType = getRestTypeOfTupleType(restType);
20136-
if (tupleRestType) {
20137-
return tupleRestType;
20138-
}
20135+
return getRestTypeOfTupleType(restType);
2013920136
}
2014020137
return getIndexTypeOfType(restType, IndexKind.Number);
2014120138
}

tests/baselines/reference/genericRestParameters1.errors.txt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
tests/cases/conformance/types/rest/genericRestParameters1.ts(22,1): error TS2556: Expected 3 arguments, but got 1 or more.
22
tests/cases/conformance/types/rest/genericRestParameters1.ts(31,1): error TS2556: Expected 3 arguments, but got 1 or more.
3+
tests/cases/conformance/types/rest/genericRestParameters1.ts(166,1): error TS2322: Type '(a: never) => void' is not assignable to type '(...args: any[]) => void'.
4+
Types of parameters 'a' and 'args' are incompatible.
5+
Type 'any' is not assignable to type 'never'.
36

47

5-
==== tests/cases/conformance/types/rest/genericRestParameters1.ts (2 errors) ====
8+
==== tests/cases/conformance/types/rest/genericRestParameters1.ts (3 errors) ====
69
declare let f1: (...x: [number, string, boolean]) => void;
710
declare let f2: (x0: number, x1: string, x2: boolean) => void;
811

@@ -161,4 +164,20 @@ tests/cases/conformance/types/rest/genericRestParameters1.ts(31,1): error TS2556
161164
events.emit('jump', 20, 'up');
162165
events.emit('stop', 'Bye!');
163166
events.emit('done');
167+
168+
// Repro from #25871
169+
170+
declare var ff1: (... args: any[]) => void;
171+
172+
declare var ff2: () => void;
173+
declare var ff3: (...args: []) => void;
174+
declare var ff4: (a: never) => void;
175+
176+
ff1 = ff2;
177+
ff1 = ff3;
178+
ff1 = ff4; // Error
179+
~~~
180+
!!! error TS2322: Type '(a: never) => void' is not assignable to type '(...args: any[]) => void'.
181+
!!! error TS2322: Types of parameters 'a' and 'args' are incompatible.
182+
!!! error TS2322: Type 'any' is not assignable to type 'never'.
164183

tests/baselines/reference/genericRestParameters1.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,18 @@ events.emit('move', 10, 'left');
153153
events.emit('jump', 20, 'up');
154154
events.emit('stop', 'Bye!');
155155
events.emit('done');
156+
157+
// Repro from #25871
158+
159+
declare var ff1: (... args: any[]) => void;
160+
161+
declare var ff2: () => void;
162+
declare var ff3: (...args: []) => void;
163+
declare var ff4: (a: never) => void;
164+
165+
ff1 = ff2;
166+
ff1 = ff3;
167+
ff1 = ff4; // Error
156168

157169

158170
//// [genericRestParameters1.js]
@@ -256,6 +268,9 @@ events.emit('move', 10, 'left');
256268
events.emit('jump', 20, 'up');
257269
events.emit('stop', 'Bye!');
258270
events.emit('done');
271+
ff1 = ff2;
272+
ff1 = ff3;
273+
ff1 = ff4; // Error
259274

260275

261276
//// [genericRestParameters1.d.ts]
@@ -332,3 +347,7 @@ declare type EventType<T> = {
332347
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
333348
};
334349
declare var events: EventType<Record1>;
350+
declare var ff1: (...args: any[]) => void;
351+
declare var ff2: () => void;
352+
declare var ff3: (...args: []) => void;
353+
declare var ff4: (a: never) => void;

tests/baselines/reference/genericRestParameters1.symbols

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,3 +622,32 @@ events.emit('done');
622622
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
623623
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
624624

625+
// Repro from #25871
626+
627+
declare var ff1: (... args: any[]) => void;
628+
>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11))
629+
>args : Symbol(args, Decl(genericRestParameters1.ts, 157, 18))
630+
631+
declare var ff2: () => void;
632+
>ff2 : Symbol(ff2, Decl(genericRestParameters1.ts, 159, 11))
633+
634+
declare var ff3: (...args: []) => void;
635+
>ff3 : Symbol(ff3, Decl(genericRestParameters1.ts, 160, 11))
636+
>args : Symbol(args, Decl(genericRestParameters1.ts, 160, 18))
637+
638+
declare var ff4: (a: never) => void;
639+
>ff4 : Symbol(ff4, Decl(genericRestParameters1.ts, 161, 11))
640+
>a : Symbol(a, Decl(genericRestParameters1.ts, 161, 18))
641+
642+
ff1 = ff2;
643+
>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11))
644+
>ff2 : Symbol(ff2, Decl(genericRestParameters1.ts, 159, 11))
645+
646+
ff1 = ff3;
647+
>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11))
648+
>ff3 : Symbol(ff3, Decl(genericRestParameters1.ts, 160, 11))
649+
650+
ff1 = ff4; // Error
651+
>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11))
652+
>ff4 : Symbol(ff4, Decl(genericRestParameters1.ts, 161, 11))
653+

tests/baselines/reference/genericRestParameters1.types

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,3 +849,35 @@ events.emit('done');
849849
>emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
850850
>'done' : "done"
851851

852+
// Repro from #25871
853+
854+
declare var ff1: (... args: any[]) => void;
855+
>ff1 : (...args: any[]) => void
856+
>args : any[]
857+
858+
declare var ff2: () => void;
859+
>ff2 : () => void
860+
861+
declare var ff3: (...args: []) => void;
862+
>ff3 : () => void
863+
>args : []
864+
865+
declare var ff4: (a: never) => void;
866+
>ff4 : (a: never) => void
867+
>a : never
868+
869+
ff1 = ff2;
870+
>ff1 = ff2 : () => void
871+
>ff1 : (...args: any[]) => void
872+
>ff2 : () => void
873+
874+
ff1 = ff3;
875+
>ff1 = ff3 : () => void
876+
>ff1 : (...args: any[]) => void
877+
>ff3 : () => void
878+
879+
ff1 = ff4; // Error
880+
>ff1 = ff4 : (a: never) => void
881+
>ff1 : (...args: any[]) => void
882+
>ff4 : (a: never) => void
883+

tests/cases/conformance/types/rest/genericRestParameters1.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,15 @@ events.emit('move', 10, 'left');
155155
events.emit('jump', 20, 'up');
156156
events.emit('stop', 'Bye!');
157157
events.emit('done');
158+
159+
// Repro from #25871
160+
161+
declare var ff1: (... args: any[]) => void;
162+
163+
declare var ff2: () => void;
164+
declare var ff3: (...args: []) => void;
165+
declare var ff4: (a: never) => void;
166+
167+
ff1 = ff2;
168+
ff1 = ff3;
169+
ff1 = ff4; // Error

0 commit comments

Comments
 (0)