Skip to content

Commit b5fda49

Browse files
authored
Use emptyObjectType for omitted members instead of unknownType (#20940)
* Use emptyObjectType for omitted members instead of unknownType * Use similar logic as is used for empty arrays for missing elements
1 parent 20c846d commit b5fda49

18 files changed

+98
-44
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14523,7 +14523,7 @@ namespace ts {
1452314523
if (patternElement.kind !== SyntaxKind.OmittedExpression) {
1452414524
error(patternElement, Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
1452514525
}
14526-
elementTypes.push(unknownType);
14526+
elementTypes.push(strictNullChecks ? implicitNeverType : undefinedWideningType);
1452714527
}
1452814528
}
1452914529
}

tests/baselines/reference/declarationEmitDestructuringArrayPattern2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var [a11, b11, c11] = [];
2323
>a11 : any
2424
>b11 : any
2525
>c11 : any
26-
>[] : [any, any, any]
26+
>[] : [undefined, undefined, undefined]
2727

2828
var [a2, [b2, { x12, y12: c2 }]=["abc", { x12: 10, y12: false }]] = [1, ["hello", { x12: 5, y12: true }]];
2929
>a2 : number

tests/baselines/reference/declarationsAndAssignments.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function f0() {
2424
>x : number
2525
>y : string
2626
>z : any
27-
>[1, "hello"] : [number, string, any]
27+
>[1, "hello"] : [number, string, undefined]
2828
>1 : 1
2929
>"hello" : "hello"
3030

@@ -258,13 +258,13 @@ function f8() {
258258
>a : any
259259
>b : any
260260
>c : any
261-
>[] : [any, any, any]
261+
>[] : [undefined, undefined, undefined]
262262

263263
var [d, e, f] = [1]; // Error, [1] is a tuple
264264
>d : number
265265
>e : any
266266
>f : any
267-
>[1] : [number, any, any]
267+
>[1] : [number, undefined, undefined]
268268
>1 : 1
269269
}
270270

tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types

+8-8
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
9393

9494
var [c2] = [];
9595
>c2 : any
96-
>[] : [any]
96+
>[] : [undefined]
9797

9898
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
9999
>c3 : any
100100
>c4 : any
101-
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
102-
>[[]] : [[any]]
103-
>[] : [any]
104-
>[[[[]]]] : [[[[any]]]]
105-
>[[[]]] : [[[any]]]
106-
>[[]] : [[any]]
107-
>[] : [any]
101+
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
102+
>[[]] : [[undefined]]
103+
>[] : [undefined]
104+
>[[[[]]]] : [[[[undefined]]]]
105+
>[[[]]] : [[[undefined]]]
106+
>[[]] : [[undefined]]
107+
>[] : [undefined]
108108

109109
var [[c5], c6]: [[string|number], boolean] = [[1], true];
110110
>c5 : string | number

tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types

+8-8
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
9393

9494
var [c2] = [];
9595
>c2 : any
96-
>[] : [any]
96+
>[] : [undefined]
9797

9898
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
9999
>c3 : any
100100
>c4 : any
101-
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
102-
>[[]] : [[any]]
103-
>[] : [any]
104-
>[[[[]]]] : [[[[any]]]]
105-
>[[[]]] : [[[any]]]
106-
>[[]] : [[any]]
107-
>[] : [any]
101+
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
102+
>[[]] : [[undefined]]
103+
>[] : [undefined]
104+
>[[[[]]]] : [[[[undefined]]]]
105+
>[[[]]] : [[[undefined]]]
106+
>[[]] : [[undefined]]
107+
>[] : [undefined]
108108

109109
var [[c5], c6]: [[string|number], boolean] = [[1], true];
110110
>c5 : string | number

tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types

+8-8
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
9393

9494
var [c2] = [];
9595
>c2 : any
96-
>[] : [any]
96+
>[] : [undefined]
9797

9898
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
9999
>c3 : any
100100
>c4 : any
101-
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
102-
>[[]] : [[any]]
103-
>[] : [any]
104-
>[[[[]]]] : [[[[any]]]]
105-
>[[[]]] : [[[any]]]
106-
>[[]] : [[any]]
107-
>[] : [any]
101+
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
102+
>[[]] : [[undefined]]
103+
>[] : [undefined]
104+
>[[[[]]]] : [[[[undefined]]]]
105+
>[[[]]] : [[[undefined]]]
106+
>[[]] : [[undefined]]
107+
>[] : [undefined]
108108

109109
var [[c5], c6]: [[string|number], boolean] = [[1], true];
110110
>c5 : string | number

tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.errors.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,6): error TS2461: Type 'undefined' is not an array type.
12
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,6): error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
3+
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,12): error TS2461: Type 'undefined' is not an array type.
24
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,12): error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
35
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(4,5): error TS2461: Type 'undefined' is not an array type.
46
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(9,5): error TS2322: Type '[number, number, string]' is not assignable to type '[number, boolean, string]'.
@@ -10,13 +12,17 @@ tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAss
1012
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(34,5): error TS2461: Type 'F' is not an array type.
1113

1214

13-
==== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts (7 errors) ====
15+
==== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts (9 errors) ====
1416
// V is an array assignment pattern, S is the type Any or an array-like type (section 3.3.2), and, for each assignment element E in V,
1517
// S is the type Any, or
1618
var [[a0], [[a1]]] = [] // Error
1719
~~~~
20+
!!! error TS2461: Type 'undefined' is not an array type.
21+
~~~~
1822
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
1923
~~~~~~
24+
!!! error TS2461: Type 'undefined' is not an array type.
25+
~~~~~~
2026
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
2127
var [[a2], [[a3]]] = undefined // Error
2228
~~~~~~~~~~~~~~

tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
var [[a0], [[a1]]] = [] // Error
55
>a0 : any
66
>a1 : any
7-
>[] : [any, any]
7+
>[] : [undefined, undefined]
88

99
var [[a2], [[a3]]] = undefined // Error
1010
>a2 : any

tests/baselines/reference/destructuringVariableDeclaration1ES5.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
151151
>f4 : number
152152
>f5 : number
153153
> : undefined
154-
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
155-
>f : [number, number, { f3: number; f5: number; }, any]
156-
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
154+
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
155+
>f : [number, number, { f3: number; f5: number; }, undefined]
156+
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
157157
>1 : 1
158158
>2 : 2
159159
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }

tests/baselines/reference/destructuringVariableDeclaration1ES5iterable.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
151151
>f4 : number
152152
>f5 : number
153153
> : undefined
154-
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
155-
>f : [number, number, { f3: number; f5: number; }, any]
156-
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
154+
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
155+
>f : [number, number, { f3: number; f5: number; }, undefined]
156+
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
157157
>1 : 1
158158
>2 : 2
159159
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }

tests/baselines/reference/destructuringVariableDeclaration1ES6.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
151151
>f4 : number
152152
>f5 : number
153153
> : undefined
154-
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
155-
>f : [number, number, { f3: number; f5: number; }, any]
156-
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
154+
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
155+
>f : [number, number, { f3: number; f5: number; }, undefined]
156+
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
157157
>1 : 1
158158
>2 : 2
159159
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }

tests/baselines/reference/downlevelLetConst12.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const bar = 1;
1212

1313
let [baz] = [];
1414
>baz : any
15-
>[] : [any]
15+
>[] : [undefined]
1616

1717
let {a: baz2} = { a: 1 };
1818
>a : any
@@ -23,7 +23,7 @@ let {a: baz2} = { a: 1 };
2323

2424
const [baz3] = []
2525
>baz3 : any
26-
>[] : [any]
26+
>[] : [undefined]
2727

2828
const {a: baz4} = { a: 1 };
2929
>a : any

tests/baselines/reference/downlevelLetConst16.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ function foo3() {
516516
}
517517
for (let [y] = []; ;) {
518518
>y : any
519-
>[] : [any]
519+
>[] : [undefined]
520520

521521
use(y);
522522
>use(y) : any
@@ -555,7 +555,7 @@ function foo4() {
555555
}
556556
for (const [y] = []; ;) {
557557
>y : any
558-
>[] : [any]
558+
>[] : [undefined]
559559

560560
use(y);
561561
>use(y) : any
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
tests/cases/compiler/initializedDestructuringAssignmentTypes.ts(3,3): error TS2339: Property 'toFixed' does not exist on type 'string'.
2+
3+
4+
==== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts (1 errors) ====
5+
const [, a = ''] = ''.match('') || [];
6+
7+
a.toFixed()
8+
~~~~~~~
9+
!!! error TS2339: Property 'toFixed' does not exist on type 'string'.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//// [initializedDestructuringAssignmentTypes.ts]
2+
const [, a = ''] = ''.match('') || [];
3+
4+
a.toFixed()
5+
6+
//// [initializedDestructuringAssignmentTypes.js]
7+
var _a = ''.match('') || [], _b = _a[1], a = _b === void 0 ? '' : _b;
8+
a.toFixed();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts ===
2+
const [, a = ''] = ''.match('') || [];
3+
>a : Symbol(a, Decl(initializedDestructuringAssignmentTypes.ts, 0, 8))
4+
>''.match : Symbol(String.match, Decl(lib.d.ts, --, --))
5+
>match : Symbol(String.match, Decl(lib.d.ts, --, --))
6+
7+
a.toFixed()
8+
>a : Symbol(a, Decl(initializedDestructuringAssignmentTypes.ts, 0, 8))
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts ===
2+
const [, a = ''] = ''.match('') || [];
3+
> : undefined
4+
>a : string
5+
>'' : ""
6+
>''.match('') || [] : RegExpMatchArray | [undefined, ""]
7+
>''.match('') : RegExpMatchArray
8+
>''.match : (regexp: string | RegExp) => RegExpMatchArray
9+
>'' : ""
10+
>match : (regexp: string | RegExp) => RegExpMatchArray
11+
>'' : ""
12+
>[] : [undefined, ""]
13+
14+
a.toFixed()
15+
>a.toFixed() : any
16+
>a.toFixed : any
17+
>a : string
18+
>toFixed : any
19+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const [, a = ''] = ''.match('') || [];
2+
3+
a.toFixed()

0 commit comments

Comments
 (0)