Skip to content

Commit 62c8ae1

Browse files
committed
Apply contextual type to empty array literals
1 parent afee8bf commit 62c8ae1

File tree

113 files changed

+254
-245
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+254
-245
lines changed

src/compiler/checker.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -16933,7 +16933,10 @@ namespace ts {
1693316933
case SyntaxKind.ObjectLiteralExpression:
1693416934
return some((node as ObjectLiteralExpression).properties, isContextSensitive);
1693516935
case SyntaxKind.ArrayLiteralExpression:
16936-
return some((node as ArrayLiteralExpression).elements, isContextSensitive);
16936+
if ((node as ArrayLiteralExpression).elements.length > 0) {
16937+
return some((node as ArrayLiteralExpression).elements, isContextSensitive);
16938+
}
16939+
return true;
1693716940
case SyntaxKind.ConditionalExpression:
1693816941
return isContextSensitive((node as ConditionalExpression).whenTrue) ||
1693916942
isContextSensitive((node as ConditionalExpression).whenFalse);
@@ -26996,6 +26999,12 @@ namespace ts {
2699626999
const elementTypes: Type[] = [];
2699727000
const elementFlags: ElementFlags[] = [];
2699827001
const contextualType = getApparentTypeOfContextualType(node);
27002+
if (elementCount === 0 && contextualType && !checkMode) {
27003+
const elementType = getElementTypeOfArrayType(contextualType);
27004+
if (elementType) {
27005+
return createArrayType(elementType);
27006+
}
27007+
}
2699927008
const inDestructuringPattern = isAssignmentTarget(node);
2700027009
const inConstContext = isConstContext(node);
2700127010
let hasOmittedExpression = false;

tests/baselines/reference/arrayAssignmentTest1.types

+8-8
Original file line numberDiff line numberDiff line change
@@ -81,35 +81,35 @@ var f1 = function () { return new C1();}
8181

8282
var arr_any: any[] = [];
8383
>arr_any : any[]
84-
>[] : undefined[]
84+
>[] : any[]
8585

8686
var arr_i1: I1[] = [];
8787
>arr_i1 : I1[]
88-
>[] : undefined[]
88+
>[] : I1[]
8989

9090
var arr_c1: C1[] = [];
9191
>arr_c1 : C1[]
92-
>[] : undefined[]
92+
>[] : C1[]
9393

9494
var arr_c2: C2[] = [];
9595
>arr_c2 : C2[]
96-
>[] : undefined[]
96+
>[] : C2[]
9797

9898
var arr_i1_2: I1[] = [];
9999
>arr_i1_2 : I1[]
100-
>[] : undefined[]
100+
>[] : I1[]
101101

102102
var arr_c1_2: C1[] = [];
103103
>arr_c1_2 : C1[]
104-
>[] : undefined[]
104+
>[] : C1[]
105105

106106
var arr_c2_2: C2[] = [];
107107
>arr_c2_2 : C2[]
108-
>[] : undefined[]
108+
>[] : C2[]
109109

110110
var arr_c3: C3[] = [];
111111
>arr_c3 : C3[]
112-
>[] : undefined[]
112+
>[] : C3[]
113113

114114
var i1_error: I1 = []; // should be an error - is
115115
>i1_error : I1

tests/baselines/reference/arrayAssignmentTest2.types

+8-8
Original file line numberDiff line numberDiff line change
@@ -81,35 +81,35 @@ var f1 = function () { return new C1();}
8181

8282
var arr_any: any[] = [];
8383
>arr_any : any[]
84-
>[] : undefined[]
84+
>[] : any[]
8585

8686
var arr_i1: I1[] = [];
8787
>arr_i1 : I1[]
88-
>[] : undefined[]
88+
>[] : I1[]
8989

9090
var arr_c1: C1[] = [];
9191
>arr_c1 : C1[]
92-
>[] : undefined[]
92+
>[] : C1[]
9393

9494
var arr_c2: C2[] = [];
9595
>arr_c2 : C2[]
96-
>[] : undefined[]
96+
>[] : C2[]
9797

9898
var arr_i1_2: I1[] = [];
9999
>arr_i1_2 : I1[]
100-
>[] : undefined[]
100+
>[] : I1[]
101101

102102
var arr_c1_2: C1[] = [];
103103
>arr_c1_2 : C1[]
104-
>[] : undefined[]
104+
>[] : C1[]
105105

106106
var arr_c2_2: C2[] = [];
107107
>arr_c2_2 : C2[]
108-
>[] : undefined[]
108+
>[] : C2[]
109109

110110
var arr_c3: C3[] = [];
111111
>arr_c3 : C3[]
112-
>[] : undefined[]
112+
>[] : C3[]
113113

114114
// "clean up error" occurs at this point
115115
arr_c3 = arr_c2_2; // should be an error - is

tests/baselines/reference/arrayAssignmentTest4.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var o1 = {one : 1};
3232

3333
var arr_any: any[] = [];
3434
>arr_any : any[]
35-
>[] : undefined[]
35+
>[] : any[]
3636

3737
arr_any = function () { return null;} // should be an error - is
3838
>arr_any = function () { return null;} : () => any

tests/baselines/reference/arrayConcat2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
=== tests/cases/compiler/arrayConcat2.ts ===
22
var a: string[] = [];
33
>a : string[]
4-
>[] : undefined[]
4+
>[] : string[]
55

66
a.concat("hello", 'world');
77
>a.concat("hello", 'world') : string[]
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
=== tests/cases/compiler/arrayFlatMap.ts ===
22
const array: number[] = [];
33
>array : number[]
4-
>[] : undefined[]
4+
>[] : number[]
55

66
const readonlyArray: ReadonlyArray<number> = [];
77
>readonlyArray : readonly number[]
8-
>[] : undefined[]
8+
>[] : number[]
99

1010
array.flatMap((): ReadonlyArray<number> => []); // ok
1111
>array.flatMap((): ReadonlyArray<number> => []) : number[]
1212
>array.flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | readonly U[], thisArg?: This) => U[]
1313
>array : number[]
1414
>flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | readonly U[], thisArg?: This) => U[]
1515
>(): ReadonlyArray<number> => [] : () => ReadonlyArray<number>
16-
>[] : undefined[]
16+
>[] : number[]
1717

1818
readonlyArray.flatMap((): ReadonlyArray<number> => []); // ok
1919
>readonlyArray.flatMap((): ReadonlyArray<number> => []) : number[]
2020
>readonlyArray.flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | readonly U[], thisArg?: This) => U[]
2121
>readonlyArray : readonly number[]
2222
>flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | readonly U[], thisArg?: This) => U[]
2323
>(): ReadonlyArray<number> => [] : () => ReadonlyArray<number>
24-
>[] : undefined[]
24+
>[] : number[]
2525

tests/baselines/reference/arrayFrom.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ interface B {
1414

1515
const inputA: A[] = [];
1616
>inputA : A[]
17-
>[] : undefined[]
17+
>[] : A[]
1818

1919
const inputB: B[] = [];
2020
>inputB : B[]
21-
>[] : undefined[]
21+
>[] : B[]
2222

2323
const inputALike: ArrayLike<A> = { length: 0 };
2424
>inputALike : ArrayLike<A>

tests/baselines/reference/arrayLiteral.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var y = new Array<number>();
2929

3030
var x2: number[] = [];
3131
>x2 : number[]
32-
>[] : undefined[]
32+
>[] : number[]
3333

3434
var x2: number[] = new Array(1);
3535
>x2 : number[]

tests/baselines/reference/arrayLiteralInNonVarArgParameter.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function panic(val: string[], ...opt: string[]) { }
77
panic([], 'one', 'two');
88
>panic([], 'one', 'two') : void
99
>panic : (val: string[], ...opt: string[]) => void
10-
>[] : undefined[]
10+
>[] : string[]
1111
>'one' : "one"
1212
>'two' : "two"
1313

tests/baselines/reference/badArraySyntax.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Z {
99

1010
var a1: Z[] = [];
1111
>a1 : Z[]
12-
>[] : undefined[]
12+
>[] : Z[]
1313

1414
var a2 = new Z[];
1515
>a2 : any

tests/baselines/reference/checkInfiniteExpansionTermination2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ function fn<T>() {
2020

2121
var values: ISubject<any>[] = [];
2222
>values : ISubject<any>[]
23-
>[] : undefined[]
23+
>[] : ISubject<any>[]
2424

2525
// Hang when using <T>, but not <any>
2626
combineLatest<T>(values);

tests/baselines/reference/checkSpecialPropertyAssignments.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ A.B = class {
1616
/** @type {string[]} */
1717
var x = [];
1818
>x : string[]
19-
>[] : undefined[]
19+
>[] : string[]
2020

2121
/** @type {number[]} */
2222
var y;

tests/baselines/reference/circularInferredTypeOfVariable.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@
1010
>p : string[]
1111

1212
return [];
13-
>[] : undefined[]
13+
>[] : string[]
1414
}
1515

1616
function bar(p: string[]): string[] {
1717
>bar : (p: string[]) => string[]
1818
>p : string[]
1919

2020
return [];
21-
>[] : undefined[]
21+
>[] : string[]
2222
}
2323

2424
let a1: string[] | undefined = [];
2525
>a1 : string[]
26-
>[] : undefined[]
26+
>[] : string[]
2727

2828
while (true) {
2929
>true : true

tests/baselines/reference/classExpressionWithStaticProperties3.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ declare var console: any;
55
const arr: {y(): number}[] = [];
66
>arr : { y(): number; }[]
77
>y : () => number
8-
>[] : undefined[]
8+
>[] : { y(): number; }[]
99

1010
for (let i = 0; i < 3; i++) {
1111
>i : number

tests/baselines/reference/classExpressionWithStaticPropertiesES63.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ declare var console: any;
55
const arr: {y(): number}[] = [];
66
>arr : { y(): number; }[]
77
>y : () => number
8-
>[] : undefined[]
8+
>[] : { y(): number; }[]
99

1010
for (let i = 0; i < 3; i++) {
1111
>i : number

tests/baselines/reference/commaOperatorLeftSideUnused.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function fn() {
1010

1111
let arr: any[] = [];
1212
>arr : any[]
13-
>[] : undefined[]
13+
>[] : any[]
1414

1515
switch(arr.length) {
1616
>arr.length : number

tests/baselines/reference/conditionalTypeDiscriminatingLargeUnionRegularTypeFetchingSpeedReasonable.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -16019,6 +16019,6 @@ export function makeThing<T extends BigUnion['name']>(
1601916019

1602016020
children: ChildrenOf<WithName<T>>[] = [],
1602116021
>children : ChildrenOf<WithName<T>>[]
16022-
>[] : undefined[]
16022+
>[] : ChildrenOf<WithName<T>>[]
1602316023

1602416024
) { }

tests/baselines/reference/contextualOverloadListFromArrayUnion.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function series<T>(tasks: Task<T>[], callback: Callback<T[]>): void {
8383

8484
let results: T[] = []
8585
>results : T[]
86-
>[] : never[]
86+
>[] : T[]
8787

8888
function next() {
8989
>next : () => void

0 commit comments

Comments
 (0)