From e5d520e463137ff9291b4baf1a80456252bf3336 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 2 Jul 2018 17:50:42 -1000 Subject: [PATCH] Add tests --- .../rest/restTuplesFromContextualTypes.ts | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/cases/conformance/types/rest/restTuplesFromContextualTypes.ts diff --git a/tests/cases/conformance/types/rest/restTuplesFromContextualTypes.ts b/tests/cases/conformance/types/rest/restTuplesFromContextualTypes.ts new file mode 100644 index 00000000000..84bf81195b0 --- /dev/null +++ b/tests/cases/conformance/types/rest/restTuplesFromContextualTypes.ts @@ -0,0 +1,72 @@ +// @strict: true +// @declaration: true + +declare const t1: [number, boolean, string]; + +(function (a, b, c){})(...t1); +(function (...x){})(...t1); +(function (a, ...x){})(...t1); +(function (a, b, ...x){})(...t1); +(function (a, b, c, ...x){})(...t1); + +declare function f1(cb: (...args: typeof t1) => void): void; + +f1((a, b, c) => {}) +f1((...x) => {}) +f1((a, ...x) => {}) +f1((a, b, ...x) => {}) +f1((a, b, c, ...x) => {}) + +declare const t2: [number, boolean, ...string[]]; + +(function (a, b, c){})(...t2); +(function (...x){})(...t2); +(function (a, ...x){})(...t2); +(function (a, b, ...x){})(...t2); +(function (a, b, c, ...x){})(...t2); + +declare function f2(cb: (...args: typeof t2) => void): void; + +f2((a, b, c) => {}) +f2((...x) => {}) +f2((a, ...x) => {}) +f2((a, b, ...x) => {}) +f2((a, b, c, ...x) => {}) + +declare const t3: [boolean, ...string[]]; + +(function (a, b, c){})(1, ...t3); +(function (...x){})(1, ...t3); +(function (a, ...x){})(1, ...t3); +(function (a, b, ...x){})(1, ...t3); +(function (a, b, c, ...x){})(1, ...t3); + +declare function f3(cb: (x: number, ...args: typeof t3) => void): void; + +f3((a, b, c) => {}) +f3((...x) => {}) +f3((a, ...x) => {}) +f3((a, b, ...x) => {}) +f3((a, b, c, ...x) => {}) + +function f4(t: T) { + (function(...x){})(...t); + (function(a, ...x){})(1, ...t); + (function(a, ...x){})(1, 2, ...t); + function f(cb: (x: number, ...args: T) => void) {} + f((...x) => {}); + f((a, ...x) => {}); + f((a, b, ...x) => {}); +} + +// Repro from #25288 + +declare var tuple: [number, string]; +(function foo(a, b){}(...tuple)); + +// Repro from #25289 + +declare function take(cb: (a: number, b: string) => void): void; + +(function foo(...rest){}(1, '')); +take(function(...rest){});