Revision e71614a185eaafa080664902f1bb7fa2802dbd01 authored by Eli Barzilay on 13 February 2020, 21:09:20 UTC, committed by Eli Barzilay on 27 February 2020, 21:43:29 UTC
Fixes #32465.

After this was done, I continued to extend the implementation to handle
TupleLike types but it'ss broken since JS doesn't allow splicing
TupleLike values into array literals so pulled that out, and instead
keeping it for reference below.  (It Includes tests, which are broken
too.)

modified   src/compiler/checker.ts
@@ -22268,6 +22268,21 @@ namespace ts {
                         else hasNonEndingSpreadElement = true;
                     }
                 }
+                else if (spreadType && isTupleLikeType(spreadType)) {
+                    let i = 0, tupleEltType: Type | undefined;
+                    while (tupleEltType = getTypeOfPropertyOfType(spreadType, "" + i as __String)) {
+                        elementTypes.push(tupleEltType);
+                        i++;
+                    }
+                    const stringIndexInfo = getIndexInfoOfType(spreadType, IndexKind.String);
+                    const numberIndexInfo = getIndexInfoOfType(spreadType, IndexKind.Number);
+                    if (stringIndexInfo || numberIndexInfo) {
+                        if (stringIndexInfo) elementTypes.push(stringIndexInfo.type);
+                        if (numberIndexInfo) elementTypes.push(numberIndexInfo.type);
+                        if (i === elementCount - 1) hasEndingSpreadElement = true;
+                        else hasNonEndingSpreadElement = true;
+                    }
+                }
                 else {
                     if (inDestructuringPattern && spreadType) {
                         // Given the following situation:
new file   tests/cases/compiler/spliceTupleLikesWIntegers.ts
@@ -0,0 +1,23 @@
+declare const sb: { [0]: string, [1]: boolean };
+
+let k1: [number, string, boolean];
+k1 = [1, ...sb];
+
+let k2: [number, string, boolean, number];
+k2 = [1, ...sb, 1];
+
+// declare const sb_: [string, ...boolean[]];
+
+// let k3: [number, string, ...boolean[]];
+// k3 = [1, ...sb_];
+
+// declare const sbb_: [string, boolean, ...boolean[]];
+
+// let k4: [number, string, ...boolean[]];
+// k4 = [1, ...sbb_];
+
+// let k5: [number, string, boolean, ...boolean[]];
+// k5 = [1, ...sbb_];
+
+// let k6: [number, string, boolean, boolean, ...boolean[]];
+// k6 = [1, ...sbb_];
new file   tests/cases/compiler/spliceTupleLikesWStrings.ts
@@ -0,0 +1,23 @@
+declare const sb: { 0: string, 1: boolean };
+
+let k1: [number, string, boolean];
+k1 = [1, ...sb];
+
+let k2: [number, string, boolean, number];
+k2 = [1, ...sb, 1];
+
+declare const sb_: { 0: string, [s: string]: (boolean|string) };
+
+let k3: [number, string, ...(boolean|string)[]];
+k3 = [1, ...sb_];
+
+declare const sbb_: { 0: string, 1: boolean, [s: string]: (boolean|string) };
+
+let k4: [number, string, boolean, ...(boolean|string)[]];
+k4 = [1, ...sbb_];
+
+// let k5: [number, string, boolean, ...(boolean|string)[]];
+// k5 = [1, ...sbb_];
+
+// let k6: [number, string, boolean, boolean, ...(boolean|string)[]];
+// k6 = [1, ...sbb_];
1 parent 6c5c48c
History
File Mode Size
build
eslint
hooks
importDefinitelyTypedTests
types
VSDevMode.ps1 -rw-r--r-- 2.8 KB
authors.ts -rw-r--r-- 6.6 KB
bisect-test.ts -rw-r--r-- 2.4 KB
browserIntegrationTest.js -rw-r--r-- 1.2 KB
buildProtocol.ts -rw-r--r-- 8.9 KB
configureLanguageServiceBuild.ts -rw-r--r-- 2.8 KB
configurePrerelease.ts -rw-r--r-- 4.5 KB
errorCheck.ts -rw-r--r-- 2.8 KB
failed-tests.d.ts -rw-r--r-- 874 bytes
failed-tests.js -rw-r--r-- 5.0 KB
generateLocalizedDiagnosticMessages.ts -rw-r--r-- 6.6 KB
link-hooks.js -rw-r--r-- 534 bytes
open-cherry-pick-pr.ts -rw-r--r-- 5.0 KB
open-user-pr.ts -rw-r--r-- 3.0 KB
perf-result-post.js -rw-r--r-- 1.5 KB
post-vsts-artifact-comment.js -rw-r--r-- 3.0 KB
processDiagnosticMessages.ts -rw-r--r-- 4.9 KB
produceLKG.ts -rw-r--r-- 3.7 KB
regenerate-unicode-identifier-parts.js -rw-r--r-- 1.5 KB
run-failed-tests.js -rw-r--r-- 2.4 KB
run-sequence.js -rw-r--r-- 747 bytes
tsconfig.eslint.json -rw-r--r-- 75 bytes
tsconfig.json -rw-r--r-- 549 bytes
update-experimental-branches.js -rw-r--r-- 4.6 KB
word2md.ts -rw-r--r-- 12.9 KB

back to top