Skip to content

Commit e71614a

Browse files
committed
Proper treatment of splicing tuples in array literals
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 commit e71614a

21 files changed

+307
-88
lines changed

src/compiler/checker.ts

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17226,7 +17226,7 @@ namespace ts {
1722617226

1722717227
/**
1722817228
* Check if a Type was written as a tuple type literal.
17229-
* Prefer using isTupleLikeType() unless the use of `elementTypes` is required.
17229+
* Prefer using isTupleLikeType() unless the use of `elementTypes`/`getTypeArguments` is required.
1723017230
*/
1723117231
function isTupleType(type: Type): type is TupleTypeReference {
1723217232
return !!(getObjectFlags(type) & ObjectFlags.Reference && (<TypeReference>type).target.objectFlags & ObjectFlags.Tuple);
@@ -22290,58 +22290,69 @@ namespace ts {
2229022290
function checkArrayLiteral(node: ArrayLiteralExpression, checkMode: CheckMode | undefined, forceTuple: boolean | undefined): Type {
2229122291
const elements = node.elements;
2229222292
const elementCount = elements.length;
22293-
let hasNonEndingSpreadElement = false;
2229422293
const elementTypes: Type[] = [];
22295-
const inDestructuringPattern = isAssignmentTarget(node);
22294+
let hasEndingSpreadElement = false;
22295+
let hasNonEndingSpreadElement = false;
2229622296
const contextualType = getApparentTypeOfContextualType(node);
22297+
const inDestructuringPattern = isAssignmentTarget(node);
2229722298
const inConstContext = isConstContext(node);
22298-
for (let index = 0; index < elementCount; index++) {
22299-
const e = elements[index];
22300-
if (inDestructuringPattern && e.kind === SyntaxKind.SpreadElement) {
22301-
// Given the following situation:
22302-
// var c: {};
22303-
// [...c] = ["", 0];
22304-
//
22305-
// c is represented in the tree as a spread element in an array literal.
22306-
// But c really functions as a rest element, and its purpose is to provide
22307-
// a contextual type for the right hand side of the assignment. Therefore,
22308-
// instead of calling checkExpression on "...c", which will give an error
22309-
// if c is not iterable/array-like, we need to act as if we are trying to
22310-
// get the contextual element type from it. So we do something similar to
22311-
// getContextualTypeForElementExpression, which will crucially not error
22312-
// if there is no index type / iterated type.
22313-
const restArrayType = checkExpression((<SpreadElement>e).expression, checkMode, forceTuple);
22314-
const restElementType = getIndexTypeOfType(restArrayType, IndexKind.Number) ||
22315-
getIteratedTypeOrElementType(IterationUse.Destructuring, restArrayType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false);
22316-
if (restElementType) {
22317-
elementTypes.push(restElementType);
22299+
for (let i = 0; i < elementCount; i++) {
22300+
const e = elements[i];
22301+
const spread = e.kind === SyntaxKind.SpreadElement && (<SpreadElement>e).expression;
22302+
const spreadType = spread && checkExpression(spread, checkMode, forceTuple);
22303+
if (spreadType && isTupleType(spreadType)) {
22304+
elementTypes.push(...getTypeArguments(spreadType));
22305+
if (spreadType.target.hasRestElement) {
22306+
if (i === elementCount - 1) hasEndingSpreadElement = true;
22307+
else hasNonEndingSpreadElement = true;
2231822308
}
2231922309
}
2232022310
else {
22321-
const elementContextualType = getContextualTypeForElementExpression(contextualType, index);
22322-
const type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple);
22323-
elementTypes.push(type);
22324-
}
22325-
if (index < elementCount - 1 && e.kind === SyntaxKind.SpreadElement) {
22326-
hasNonEndingSpreadElement = true;
22311+
if (inDestructuringPattern && spreadType) {
22312+
// Given the following situation:
22313+
// var c: {};
22314+
// [...c] = ["", 0];
22315+
//
22316+
// c is represented in the tree as a spread element in an array literal.
22317+
// But c really functions as a rest element, and its purpose is to provide
22318+
// a contextual type for the right hand side of the assignment. Therefore,
22319+
// instead of calling checkExpression on "...c", which will give an error
22320+
// if c is not iterable/array-like, we need to act as if we are trying to
22321+
// get the contextual element type from it. So we do something similar to
22322+
// getContextualTypeForElementExpression, which will crucially not error
22323+
// if there is no index type / iterated type.
22324+
const restElementType = getIndexTypeOfType(spreadType, IndexKind.Number) ||
22325+
getIteratedTypeOrElementType(IterationUse.Destructuring, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false);
22326+
if (restElementType) {
22327+
elementTypes.push(restElementType);
22328+
}
22329+
}
22330+
else {
22331+
const elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length);
22332+
const type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple);
22333+
elementTypes.push(type);
22334+
}
22335+
if (spread) { // tuples are done above, so these are only arrays
22336+
if (i === elementCount - 1) hasEndingSpreadElement = true;
22337+
else hasNonEndingSpreadElement = true;
22338+
}
2232722339
}
2232822340
}
2232922341
if (!hasNonEndingSpreadElement) {
22330-
const hasRestElement = elementCount > 0 && elements[elementCount - 1].kind === SyntaxKind.SpreadElement;
22331-
const minLength = elementCount - (hasRestElement ? 1 : 0);
22342+
const minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0);
2233222343
// If array literal is actually a destructuring pattern, mark it as an implied type. We do this such
2233322344
// that we get the same behavior for "var [x, y] = []" and "[x, y] = []".
2233422345
let tupleResult;
2233522346
if (inDestructuringPattern && minLength > 0) {
22336-
const type = cloneTypeReference(<TypeReference>createTupleType(elementTypes, minLength, hasRestElement));
22347+
const type = cloneTypeReference(<TypeReference>createTupleType(elementTypes, minLength, hasEndingSpreadElement));
2233722348
type.pattern = node;
2233822349
return type;
2233922350
}
22340-
else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, inConstContext)) {
22351+
else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) {
2234122352
return createArrayLiteralType(tupleResult);
2234222353
}
2234322354
else if (forceTuple) {
22344-
return createArrayLiteralType(createTupleType(elementTypes, minLength, hasRestElement));
22355+
return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement));
2234522356
}
2234622357
}
2234722358
return createArrayLiteralType(createArrayType(elementTypes.length ?

tests/baselines/reference/arrayLiteralExpressionContextualTyping.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionConte
77
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(8,5): error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'.
88
Types of property 'length' are incompatible.
99
Type '4' is not assignable to type '3'.
10-
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(14,5): error TS2322: Type '[number, number, number, ...number[]]' is not assignable to type '[number, number, number]'.
10+
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(14,5): error TS2322: Type '[number, number, number, number, number, number]' is not assignable to type '[number, number, number]'.
1111
Types of property 'length' are incompatible.
12-
Type 'number' is not assignable to type '3'.
12+
Type '6' is not assignable to type '3'.
1313

1414

1515
==== tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts (4 errors) ====
@@ -40,7 +40,7 @@ tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionConte
4040
var spr1 = [1, 2, 3, ...tup];
4141
var spr2:[number, number, number] = [1, 2, 3, ...tup]; // Error
4242
~~~~
43-
!!! error TS2322: Type '[number, number, number, ...number[]]' is not assignable to type '[number, number, number]'.
43+
!!! error TS2322: Type '[number, number, number, number, number, number]' is not assignable to type '[number, number, number]'.
4444
!!! error TS2322: Types of property 'length' are incompatible.
45-
!!! error TS2322: Type 'number' is not assignable to type '3'.
45+
!!! error TS2322: Type '6' is not assignable to type '3'.
4646

tests/baselines/reference/arrayLiteralExpressionContextualTyping.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ var spr1 = [1, 2, 3, ...tup];
6262

6363
var spr2:[number, number, number] = [1, 2, 3, ...tup]; // Error
6464
>spr2 : [number, number, number]
65-
>[1, 2, 3, ...tup] : [number, number, number, ...number[]]
65+
>[1, 2, 3, ...tup] : [number, number, number, number, number, number]
6666
>1 : 1
6767
>2 : 2
6868
>3 : 3

tests/baselines/reference/arrayLiterals3.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(11,51): erro
55
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(17,5): error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'.
66
Types of property 'length' are incompatible.
77
Type '4' is not assignable to type '2'.
8-
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(32,5): error TS2739: Type '(number[] | string[])[]' is missing the following properties from type 'tup': 0, 1
98
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(33,5): error TS2739: Type 'number[]' is missing the following properties from type '[number, number, number]': 0, 1, 2
109
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error TS2322: Type '(string | number)[]' is not assignable to type 'myArray'.
1110
The types returned by 'pop()' are incompatible between these types.
1211
Type 'string | number' is not assignable to type 'Number'.
1312
Type 'string' is not assignable to type 'Number'.
1413

1514

16-
==== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts (8 errors) ====
15+
==== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts (7 errors) ====
1716
// Each element expression in a non-empty array literal is processed as follows:
1817
// - If the array literal contains no spread elements, and if the array literal is contextually typed (section 4.19)
1918
// by a type T and T has a property with the numeric name N, where N is the index of the element expression in the array literal,
@@ -58,8 +57,6 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
5857
interface myArray extends Array<Number> { }
5958
interface myArray2 extends Array<Number|String> { }
6059
var c0: tup = [...temp2]; // Error
61-
~~
62-
!!! error TS2739: Type '(number[] | string[])[]' is missing the following properties from type 'tup': 0, 1
6360
var c1: [number, number, number] = [...temp1]; // Error cannot assign number[] to [number, number, number]
6461
~~
6562
!!! error TS2739: Type 'number[]' is missing the following properties from type '[number, number, number]': 0, 1, 2

tests/baselines/reference/arrayLiterals3.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ interface myArray extends Array<Number> { }
7171
interface myArray2 extends Array<Number|String> { }
7272
var c0: tup = [...temp2]; // Error
7373
>c0 : tup
74-
>[...temp2] : (number[] | string[])[]
74+
>[...temp2] : [number[], string[]]
7575
>...temp2 : number[] | string[]
7676
>temp2 : [number[], string[]]
7777

tests/baselines/reference/constAssertions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ declare let vc1: "abc";
143143
declare let a1: readonly [];
144144
declare let a2: readonly [1, 2, 3];
145145
declare let a3: readonly [10, "hello", true];
146-
declare let a4: readonly (1 | 2 | 3)[];
146+
declare let a4: readonly [1, 2, 3];
147147
declare let a5: number[];
148148
declare let a6: readonly number[];
149149
declare let a7: number[];

tests/baselines/reference/constAssertions.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ let a3 = [10, 'hello', true] as const;
125125
>true : true
126126

127127
let a4 = [...[1, 2, 3]] as const;
128-
>a4 : readonly (1 | 2 | 3)[]
129-
>[...[1, 2, 3]] as const : readonly (1 | 2 | 3)[]
130-
>[...[1, 2, 3]] : readonly (1 | 2 | 3)[]
128+
>a4 : readonly [1, 2, 3]
129+
>[...[1, 2, 3]] as const : readonly [1, 2, 3]
130+
>[...[1, 2, 3]] : readonly [1, 2, 3]
131131
>...[1, 2, 3] : 1 | 2 | 3
132132
>[1, 2, 3] : readonly [1, 2, 3]
133133
>1 : 1

tests/baselines/reference/declarationsAndAssignments.types

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -727,22 +727,22 @@ function f20(v: [number, number, number]) {
727727

728728
[...a3] = v;
729729
>[...a3] = v : [number, number, number]
730-
>[...a3] : number[]
730+
>[...a3] : [number, number, number]
731731
>...a3 : number
732732
>a3 : [number, number, number]
733733
>v : [number, number, number]
734734

735735
[x, ...a2] = v;
736736
>[x, ...a2] = v : [number, number, number]
737-
>[x, ...a2] : [number, ...number[]]
737+
>[x, ...a2] : [number, number, number]
738738
>x : number
739739
>...a2 : number
740740
>a2 : [number, number]
741741
>v : [number, number, number]
742742

743743
[x, y, ...a1] = v;
744744
>[x, y, ...a1] = v : [number, number, number]
745-
>[x, y, ...a1] : [number, number, ...number[]]
745+
>[x, y, ...a1] : [number, number, number]
746746
>x : number
747747
>y : number
748748
>...a1 : number
@@ -751,7 +751,7 @@ function f20(v: [number, number, number]) {
751751

752752
[x, y, z, ...a0] = v;
753753
>[x, y, z, ...a0] = v : [number, number, number]
754-
>[x, y, z, ...a0] : [number, number, number, ...never[]]
754+
>[x, y, z, ...a0] : [number, number, number]
755755
>x : number
756756
>y : number
757757
>z : number
@@ -809,22 +809,22 @@ function f21(v: [number, string, boolean]) {
809809

810810
[...a0] = v;
811811
>[...a0] = v : [number, string, boolean]
812-
>[...a0] : (string | number | boolean)[]
812+
>[...a0] : [number, string, boolean]
813813
>...a0 : string | number | boolean
814814
>a0 : [number, string, boolean]
815815
>v : [number, string, boolean]
816816

817817
[x, ...a1] = v;
818818
>[x, ...a1] = v : [number, string, boolean]
819-
>[x, ...a1] : [number, ...(string | boolean)[]]
819+
>[x, ...a1] : [number, string, boolean]
820820
>x : number
821821
>...a1 : string | boolean
822822
>a1 : [string, boolean]
823823
>v : [number, string, boolean]
824824

825825
[x, y, ...a2] = v;
826826
>[x, y, ...a2] = v : [number, string, boolean]
827-
>[x, y, ...a2] : [number, string, ...boolean[]]
827+
>[x, y, ...a2] : [number, string, boolean]
828828
>x : number
829829
>y : string
830830
>...a2 : boolean
@@ -833,7 +833,7 @@ function f21(v: [number, string, boolean]) {
833833

834834
[x, y, z, ...a3] = v;
835835
>[x, y, z, ...a3] = v : [number, string, boolean]
836-
>[x, y, z, ...a3] : [number, string, boolean, ...never[]]
836+
>[x, y, z, ...a3] : [number, string, boolean]
837837
>x : number
838838
>y : string
839839
>z : boolean

tests/baselines/reference/destructuringTuple.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ declare var receiver: typeof tuple;
1515

1616
[...receiver] = tuple;
1717
>[...receiver] = tuple : [boolean, number, ...string[]]
18-
>[...receiver] : (string | number | boolean)[]
18+
>[...receiver] : [boolean, number, ...string[]]
1919
>...receiver : string | number | boolean
2020
>receiver : [boolean, number, ...string[]]
2121
>tuple : [boolean, number, ...string[]]

tests/baselines/reference/for-of49.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var map = new Map([["", true]]);
1313
>true : true
1414

1515
for ([k, ...[v]] of map) {
16-
>[k, ...[v]] : [string, ...boolean[]]
16+
>[k, ...[v]] : [string, boolean]
1717
>k : string
1818
>...[v] : boolean
1919
>[v] : [boolean]

tests/baselines/reference/literalFreshnessPropagationOnNarrowing.errors.txt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
tests/cases/compiler/literalFreshnessPropagationOnNarrowing.ts(37,5): error TS2322: Type '"y"' is not assignable to type '"x"'.
2-
tests/cases/compiler/literalFreshnessPropagationOnNarrowing.ts(60,5): error TS2322: Type 'string[]' is not assignable to type 'XY[]'.
3-
Type 'string' is not assignable to type 'XY'.
2+
tests/cases/compiler/literalFreshnessPropagationOnNarrowing.ts(60,12): error TS2322: Type 'string' is not assignable to type 'XY'.
43

54

65
==== tests/cases/compiler/literalFreshnessPropagationOnNarrowing.ts (2 errors) ====
@@ -66,7 +65,6 @@ tests/cases/compiler/literalFreshnessPropagationOnNarrowing.ts(60,5): error TS23
6665
// Desired: OK
6766
// Error in all extant branches
6867
arr = [...['y']];
69-
~~~
70-
!!! error TS2322: Type 'string[]' is not assignable to type 'XY[]'.
71-
!!! error TS2322: Type 'string' is not assignable to type 'XY'.
68+
~~~~~~~~
69+
!!! error TS2322: Type 'string' is not assignable to type 'XY'.
7270
}

tests/baselines/reference/restElementMustBeLast.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ var [...a, x] = [1, 2, 3]; // Error, rest must be last element
88
>3 : 3
99

1010
[...a, x] = [1, 2, 3]; // Error, rest must be last element
11-
>[...a, x] = [1, 2, 3] : number[]
12-
>[...a, x] : number[]
11+
>[...a, x] = [1, 2, 3] : [number, number, number]
12+
>[...a, x] : [number, number, number, number]
1313
>...a : number
1414
>a : [number, number, number]
1515
>x : number
16-
>[1, 2, 3] : number[]
16+
>[1, 2, 3] : [number, number, number]
1717
>1 : 1
1818
>2 : 2
1919
>3 : 3

tests/baselines/reference/restElementWithAssignmentPattern1.errors.txt

Lines changed: 0 additions & 15 deletions
This file was deleted.

tests/baselines/reference/restElementWithAssignmentPattern1.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ var a: string, b: number;
44
>b : number
55

66
[...[a, b = 0]] = ["", 1];
7-
>[...[a, b = 0]] = ["", 1] : (string | number)[]
8-
>[...[a, b = 0]] : (string | number)[]
7+
>[...[a, b = 0]] = ["", 1] : [string, number]
8+
>[...[a, b = 0]] : [string, number]
99
>...[a, b = 0] : string | number
1010
>[a, b = 0] : [string, number]
1111
>a : string
1212
>b = 0 : 0
1313
>b : number
1414
>0 : 0
15-
>["", 1] : (string | number)[]
15+
>["", 1] : [string, number]
1616
>"" : ""
1717
>1 : 1
1818

tests/baselines/reference/restElementWithAssignmentPattern3.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var tuple: [string, number] = ["", 1];
1111

1212
[...[a, b = 0]] = tuple;
1313
>[...[a, b = 0]] = tuple : [string, number]
14-
>[...[a, b = 0]] : (string | number)[]
14+
>[...[a, b = 0]] : [string, number]
1515
>...[a, b = 0] : string | number
1616
>[a, b = 0] : [string, number]
1717
>a : string

tests/baselines/reference/restElementWithAssignmentPattern5.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ var s: string, s2: string;
44
>s2 : string
55

66
[...[s, s2]] = ["", ""];
7-
>[...[s, s2]] = ["", ""] : string[]
8-
>[...[s, s2]] : string[]
7+
>[...[s, s2]] = ["", ""] : [string, string]
8+
>[...[s, s2]] : [string, string]
99
>...[s, s2] : string
1010
>[s, s2] : [string, string]
1111
>s : string
1212
>s2 : string
13-
>["", ""] : string[]
13+
>["", ""] : [string, string]
1414
>"" : ""
1515
>"" : ""
1616

0 commit comments

Comments
 (0)