e71614a185
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_];
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
//// [spliceTuples.ts]
|
|
declare const sb: [string, 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_];
|
|
|
|
|
|
//// [spliceTuples.js]
|
|
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
r[k] = a[j];
|
|
return r;
|
|
};
|
|
var k1;
|
|
k1 = __spreadArrays([1], sb);
|
|
var k2;
|
|
k2 = __spreadArrays([1], sb, [1]);
|
|
var k3;
|
|
k3 = __spreadArrays([1], sb_);
|
|
var k4;
|
|
k4 = __spreadArrays([1], sbb_);
|
|
var k5;
|
|
k5 = __spreadArrays([1], sbb_);
|
|
var k6;
|
|
k6 = __spreadArrays([1], sbb_);
|