From 5288c37010e75f793ce3a1b1e08bb7dc04761f99 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 25 Jul 2018 12:42:37 -0700 Subject: [PATCH 1/3] Rest parameter with fixed size tuple should be same as regular parameters --- src/compiler/checker.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 26a2e9fbc70..ed83f8af189 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20132,10 +20132,7 @@ namespace ts { if (pos - paramCount < getLengthOfTupleType(restType)) { return restType.typeArguments![pos - paramCount]; } - const tupleRestType = getRestTypeOfTupleType(restType); - if (tupleRestType) { - return tupleRestType; - } + return getRestTypeOfTupleType(restType); } return getIndexTypeOfType(restType, IndexKind.Number); } From 1aa2b15f8cbfe20f202df6ac8a5a9b85ad1ccf92 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 25 Jul 2018 12:42:47 -0700 Subject: [PATCH 2/3] Add regression test --- .../conformance/types/rest/genericRestParameters1.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/cases/conformance/types/rest/genericRestParameters1.ts b/tests/cases/conformance/types/rest/genericRestParameters1.ts index d3e65e754ec..ac8434dc5b2 100644 --- a/tests/cases/conformance/types/rest/genericRestParameters1.ts +++ b/tests/cases/conformance/types/rest/genericRestParameters1.ts @@ -155,3 +155,15 @@ events.emit('move', 10, 'left'); events.emit('jump', 20, 'up'); events.emit('stop', 'Bye!'); events.emit('done'); + +// Repro from #25871 + +declare var ff1: (... args: any[]) => void; + +declare var ff2: () => void; +declare var ff3: (...args: []) => void; +declare var ff4: (a: never) => void; + +ff1 = ff2; +ff1 = ff3; +ff1 = ff4; // Error From 0758700f7d83554d1addb46c059713342c123e95 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 25 Jul 2018 12:43:10 -0700 Subject: [PATCH 3/3] Accept new baselines --- .../genericRestParameters1.errors.txt | 21 +++++++++++- .../reference/genericRestParameters1.js | 19 +++++++++++ .../reference/genericRestParameters1.symbols | 29 +++++++++++++++++ .../reference/genericRestParameters1.types | 32 +++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/genericRestParameters1.errors.txt b/tests/baselines/reference/genericRestParameters1.errors.txt index c9234260714..2f314387424 100644 --- a/tests/baselines/reference/genericRestParameters1.errors.txt +++ b/tests/baselines/reference/genericRestParameters1.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/types/rest/genericRestParameters1.ts(22,1): error TS2556: Expected 3 arguments, but got 1 or more. tests/cases/conformance/types/rest/genericRestParameters1.ts(31,1): error TS2556: Expected 3 arguments, but got 1 or more. +tests/cases/conformance/types/rest/genericRestParameters1.ts(166,1): error TS2322: Type '(a: never) => void' is not assignable to type '(...args: any[]) => void'. + Types of parameters 'a' and 'args' are incompatible. + Type 'any' is not assignable to type 'never'. -==== tests/cases/conformance/types/rest/genericRestParameters1.ts (2 errors) ==== +==== tests/cases/conformance/types/rest/genericRestParameters1.ts (3 errors) ==== declare let f1: (...x: [number, string, boolean]) => void; declare let f2: (x0: number, x1: string, x2: boolean) => void; @@ -161,4 +164,20 @@ tests/cases/conformance/types/rest/genericRestParameters1.ts(31,1): error TS2556 events.emit('jump', 20, 'up'); events.emit('stop', 'Bye!'); events.emit('done'); + + // Repro from #25871 + + declare var ff1: (... args: any[]) => void; + + declare var ff2: () => void; + declare var ff3: (...args: []) => void; + declare var ff4: (a: never) => void; + + ff1 = ff2; + ff1 = ff3; + ff1 = ff4; // Error + ~~~ +!!! error TS2322: Type '(a: never) => void' is not assignable to type '(...args: any[]) => void'. +!!! error TS2322: Types of parameters 'a' and 'args' are incompatible. +!!! error TS2322: Type 'any' is not assignable to type 'never'. \ No newline at end of file diff --git a/tests/baselines/reference/genericRestParameters1.js b/tests/baselines/reference/genericRestParameters1.js index 89d92facba6..d41565e4c6a 100644 --- a/tests/baselines/reference/genericRestParameters1.js +++ b/tests/baselines/reference/genericRestParameters1.js @@ -153,6 +153,18 @@ events.emit('move', 10, 'left'); events.emit('jump', 20, 'up'); events.emit('stop', 'Bye!'); events.emit('done'); + +// Repro from #25871 + +declare var ff1: (... args: any[]) => void; + +declare var ff2: () => void; +declare var ff3: (...args: []) => void; +declare var ff4: (a: never) => void; + +ff1 = ff2; +ff1 = ff3; +ff1 = ff4; // Error //// [genericRestParameters1.js] @@ -256,6 +268,9 @@ events.emit('move', 10, 'left'); events.emit('jump', 20, 'up'); events.emit('stop', 'Bye!'); events.emit('done'); +ff1 = ff2; +ff1 = ff3; +ff1 = ff4; // Error //// [genericRestParameters1.d.ts] @@ -332,3 +347,7 @@ declare type EventType = { emit(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void; }; declare var events: EventType; +declare var ff1: (...args: any[]) => void; +declare var ff2: () => void; +declare var ff3: (...args: []) => void; +declare var ff4: (a: never) => void; diff --git a/tests/baselines/reference/genericRestParameters1.symbols b/tests/baselines/reference/genericRestParameters1.symbols index d56774eacae..87ddbfcf6fe 100644 --- a/tests/baselines/reference/genericRestParameters1.symbols +++ b/tests/baselines/reference/genericRestParameters1.symbols @@ -622,3 +622,32 @@ events.emit('done'); >events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11)) >emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21)) +// Repro from #25871 + +declare var ff1: (... args: any[]) => void; +>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11)) +>args : Symbol(args, Decl(genericRestParameters1.ts, 157, 18)) + +declare var ff2: () => void; +>ff2 : Symbol(ff2, Decl(genericRestParameters1.ts, 159, 11)) + +declare var ff3: (...args: []) => void; +>ff3 : Symbol(ff3, Decl(genericRestParameters1.ts, 160, 11)) +>args : Symbol(args, Decl(genericRestParameters1.ts, 160, 18)) + +declare var ff4: (a: never) => void; +>ff4 : Symbol(ff4, Decl(genericRestParameters1.ts, 161, 11)) +>a : Symbol(a, Decl(genericRestParameters1.ts, 161, 18)) + +ff1 = ff2; +>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11)) +>ff2 : Symbol(ff2, Decl(genericRestParameters1.ts, 159, 11)) + +ff1 = ff3; +>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11)) +>ff3 : Symbol(ff3, Decl(genericRestParameters1.ts, 160, 11)) + +ff1 = ff4; // Error +>ff1 : Symbol(ff1, Decl(genericRestParameters1.ts, 157, 11)) +>ff4 : Symbol(ff4, Decl(genericRestParameters1.ts, 161, 11)) + diff --git a/tests/baselines/reference/genericRestParameters1.types b/tests/baselines/reference/genericRestParameters1.types index 7fc8adefc97..0ec3daaa2f9 100644 --- a/tests/baselines/reference/genericRestParameters1.types +++ b/tests/baselines/reference/genericRestParameters1.types @@ -849,3 +849,35 @@ events.emit('done'); >emit : (e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void >'done' : "done" +// Repro from #25871 + +declare var ff1: (... args: any[]) => void; +>ff1 : (...args: any[]) => void +>args : any[] + +declare var ff2: () => void; +>ff2 : () => void + +declare var ff3: (...args: []) => void; +>ff3 : () => void +>args : [] + +declare var ff4: (a: never) => void; +>ff4 : (a: never) => void +>a : never + +ff1 = ff2; +>ff1 = ff2 : () => void +>ff1 : (...args: any[]) => void +>ff2 : () => void + +ff1 = ff3; +>ff1 = ff3 : () => void +>ff1 : (...args: any[]) => void +>ff3 : () => void + +ff1 = ff4; // Error +>ff1 = ff4 : (a: never) => void +>ff1 : (...args: any[]) => void +>ff4 : (a: never) => void +