Skip to content

Commit

Permalink
Use emptyObjectType for omitted members instead of unknownType (#20940)
Browse files Browse the repository at this point in the history
* Use emptyObjectType for omitted members instead of unknownType

* Use similar logic as is used for empty arrays for missing elements
  • Loading branch information
weswigham authored Jan 8, 2018
1 parent 20c846d commit b5fda49
Show file tree
Hide file tree
Showing 18 changed files with 98 additions and 44 deletions.
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14523,7 +14523,7 @@ namespace ts {
if (patternElement.kind !== SyntaxKind.OmittedExpression) {
error(patternElement, Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
}
elementTypes.push(unknownType);
elementTypes.push(strictNullChecks ? implicitNeverType : undefinedWideningType);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var [a11, b11, c11] = [];
>a11 : any
>b11 : any
>c11 : any
>[] : [any, any, any]
>[] : [undefined, undefined, undefined]

var [a2, [b2, { x12, y12: c2 }]=["abc", { x12: 10, y12: false }]] = [1, ["hello", { x12: 5, y12: true }]];
>a2 : number
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/declarationsAndAssignments.types
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function f0() {
>x : number
>y : string
>z : any
>[1, "hello"] : [number, string, any]
>[1, "hello"] : [number, string, undefined]
>1 : 1
>"hello" : "hello"

Expand Down Expand Up @@ -258,13 +258,13 @@ function f8() {
>a : any
>b : any
>c : any
>[] : [any, any, any]
>[] : [undefined, undefined, undefined]

var [d, e, f] = [1]; // Error, [1] is a tuple
>d : number
>e : any
>f : any
>[1] : [number, any, any]
>[1] : [number, undefined, undefined]
>1 : 1
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,18 +93,18 @@ var [c0, c1] = [...temp];

var [c2] = [];
>c2 : any
>[] : [any]
>[] : [undefined]

var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
>[[]] : [[any]]
>[] : [any]
>[[[[]]]] : [[[[any]]]]
>[[[]]] : [[[any]]]
>[[]] : [[any]]
>[] : [any]
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]

var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,18 +93,18 @@ var [c0, c1] = [...temp];

var [c2] = [];
>c2 : any
>[] : [any]
>[] : [undefined]

var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
>[[]] : [[any]]
>[] : [any]
>[[[[]]]] : [[[[any]]]]
>[[[]]] : [[[any]]]
>[[]] : [[any]]
>[] : [any]
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]

var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,18 +93,18 @@ var [c0, c1] = [...temp];

var [c2] = [];
>c2 : any
>[] : [any]
>[] : [undefined]

var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[any]], [[[[any]]]]]
>[[]] : [[any]]
>[] : [any]
>[[[[]]]] : [[[[any]]]]
>[[[]]] : [[[any]]]
>[[]] : [[any]]
>[] : [any]
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]

var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,6): error TS2461: Type 'undefined' is not an array type.
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.
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(3,12): error TS2461: Type 'undefined' is not an array type.
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.
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(4,5): error TS2461: Type 'undefined' is not an array type.
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(9,5): error TS2322: Type '[number, number, string]' is not assignable to type '[number, boolean, string]'.
Expand All @@ -10,13 +12,17 @@ tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAss
tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts(34,5): error TS2461: Type 'F' is not an array type.


==== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts (7 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts (9 errors) ====
// 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,
// S is the type Any, or
var [[a0], [[a1]]] = [] // Error
~~~~
!!! error TS2461: Type 'undefined' is not an array type.
~~~~
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
~~~~~~
!!! error TS2461: Type 'undefined' is not an array type.
~~~~~~
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
var [[a2], [[a3]]] = undefined // Error
~~~~~~~~~~~~~~
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
var [[a0], [[a1]]] = [] // Error
>a0 : any
>a1 : any
>[] : [any, any]
>[] : [undefined, undefined]

var [[a2], [[a3]]] = undefined // Error
>a2 : any
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
>f : [number, number, { f3: number; f5: number; }, any]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
>f : [number, number, { f3: number; f5: number; }, any]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, any]; }
>f : [number, number, { f3: number; f5: number; }, any]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, any]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/downlevelLetConst12.types
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const bar = 1;

let [baz] = [];
>baz : any
>[] : [any]
>[] : [undefined]

let {a: baz2} = { a: 1 };
>a : any
Expand All @@ -23,7 +23,7 @@ let {a: baz2} = { a: 1 };

const [baz3] = []
>baz3 : any
>[] : [any]
>[] : [undefined]

const {a: baz4} = { a: 1 };
>a : any
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/downlevelLetConst16.types
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ function foo3() {
}
for (let [y] = []; ;) {
>y : any
>[] : [any]
>[] : [undefined]

use(y);
>use(y) : any
Expand Down Expand Up @@ -555,7 +555,7 @@ function foo4() {
}
for (const [y] = []; ;) {
>y : any
>[] : [any]
>[] : [undefined]

use(y);
>use(y) : any
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
tests/cases/compiler/initializedDestructuringAssignmentTypes.ts(3,3): error TS2339: Property 'toFixed' does not exist on type 'string'.


==== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts (1 errors) ====
const [, a = ''] = ''.match('') || [];

a.toFixed()
~~~~~~~
!!! error TS2339: Property 'toFixed' does not exist on type 'string'.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//// [initializedDestructuringAssignmentTypes.ts]
const [, a = ''] = ''.match('') || [];

a.toFixed()

//// [initializedDestructuringAssignmentTypes.js]
var _a = ''.match('') || [], _b = _a[1], a = _b === void 0 ? '' : _b;
a.toFixed();
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
=== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts ===
const [, a = ''] = ''.match('') || [];
>a : Symbol(a, Decl(initializedDestructuringAssignmentTypes.ts, 0, 8))
>''.match : Symbol(String.match, Decl(lib.d.ts, --, --))
>match : Symbol(String.match, Decl(lib.d.ts, --, --))

a.toFixed()
>a : Symbol(a, Decl(initializedDestructuringAssignmentTypes.ts, 0, 8))

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
=== tests/cases/compiler/initializedDestructuringAssignmentTypes.ts ===
const [, a = ''] = ''.match('') || [];
> : undefined
>a : string
>'' : ""
>''.match('') || [] : RegExpMatchArray | [undefined, ""]
>''.match('') : RegExpMatchArray
>''.match : (regexp: string | RegExp) => RegExpMatchArray
>'' : ""
>match : (regexp: string | RegExp) => RegExpMatchArray
>'' : ""
>[] : [undefined, ""]

a.toFixed()
>a.toFixed() : any
>a.toFixed : any
>a : string
>toFixed : any

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const [, a = ''] = ''.match('') || [];

a.toFixed()

0 comments on commit b5fda49

Please sign in to comment.