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
This commit is contained in:
Wesley Wigham
2018-01-08 12:27:11 -08:00
committed by GitHub
parent 20c846d671
commit b5fda4970d
18 changed files with 98 additions and 44 deletions

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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"
@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]'.
@@ -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
~~~~~~~~~~~~~~

View File

@@ -4,7 +4,7 @@
var [[a0], [[a1]]] = [] // Error
>a0 : any
>a1 : any
>[] : [any, any]
>[] : [undefined, undefined]
var [[a2], [[a3]]] = undefined // Error
>a2 : any

View File

@@ -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; }

View File

@@ -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; }

View File

@@ -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; }

View File

@@ -12,7 +12,7 @@ const bar = 1;
let [baz] = [];
>baz : any
>[] : [any]
>[] : [undefined]
let {a: baz2} = { a: 1 };
>a : any
@@ -23,7 +23,7 @@ let {a: baz2} = { a: 1 };
const [baz3] = []
>baz3 : any
>[] : [any]
>[] : [undefined]
const {a: baz4} = { a: 1 };
>a : any

View File

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

View File

@@ -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'.

View File

@@ -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();

View File

@@ -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))

View File

@@ -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

View File

@@ -0,0 +1,3 @@
const [, a = ''] = ''.match('') || [];
a.toFixed()