diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6e822e1caf4..ff6371e679c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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); } } } diff --git a/tests/baselines/reference/declarationEmitDestructuringArrayPattern2.types b/tests/baselines/reference/declarationEmitDestructuringArrayPattern2.types index 45f76b94b51..807bb154935 100644 --- a/tests/baselines/reference/declarationEmitDestructuringArrayPattern2.types +++ b/tests/baselines/reference/declarationEmitDestructuringArrayPattern2.types @@ -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 diff --git a/tests/baselines/reference/declarationsAndAssignments.types b/tests/baselines/reference/declarationsAndAssignments.types index b49868c4750..6bd5b8da7cb 100644 --- a/tests/baselines/reference/declarationsAndAssignments.types +++ b/tests/baselines/reference/declarationsAndAssignments.types @@ -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 } diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types index e42d08bbebc..bddce3cc391 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types @@ -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 diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types index 68b6565b004..e17e37f4980 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types @@ -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 diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types index 8bde2455171..0c6b87eb46a 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types @@ -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 diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.errors.txt b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.errors.txt index 610167a1bc0..848093e1161 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.errors.txt +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.errors.txt @@ -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 ~~~~~~~~~~~~~~ diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types index dc76e8a4a8a..9c29ea1a423 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types @@ -4,7 +4,7 @@ var [[a0], [[a1]]] = [] // Error >a0 : any >a1 : any ->[] : [any, any] +>[] : [undefined, undefined] var [[a2], [[a3]]] = undefined // Error >a2 : any diff --git a/tests/baselines/reference/destructuringVariableDeclaration1ES5.types b/tests/baselines/reference/destructuringVariableDeclaration1ES5.types index 1502288895b..125fd8a2c21 100644 --- a/tests/baselines/reference/destructuringVariableDeclaration1ES5.types +++ b/tests/baselines/reference/destructuringVariableDeclaration1ES5.types @@ -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; } diff --git a/tests/baselines/reference/destructuringVariableDeclaration1ES5iterable.types b/tests/baselines/reference/destructuringVariableDeclaration1ES5iterable.types index 1a4b35b373b..d97bb20d24a 100644 --- a/tests/baselines/reference/destructuringVariableDeclaration1ES5iterable.types +++ b/tests/baselines/reference/destructuringVariableDeclaration1ES5iterable.types @@ -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; } diff --git a/tests/baselines/reference/destructuringVariableDeclaration1ES6.types b/tests/baselines/reference/destructuringVariableDeclaration1ES6.types index c71e74c0594..ec42861b2fc 100644 --- a/tests/baselines/reference/destructuringVariableDeclaration1ES6.types +++ b/tests/baselines/reference/destructuringVariableDeclaration1ES6.types @@ -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; } diff --git a/tests/baselines/reference/downlevelLetConst12.types b/tests/baselines/reference/downlevelLetConst12.types index 918d6c94e57..725e446e010 100644 --- a/tests/baselines/reference/downlevelLetConst12.types +++ b/tests/baselines/reference/downlevelLetConst12.types @@ -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 diff --git a/tests/baselines/reference/downlevelLetConst16.types b/tests/baselines/reference/downlevelLetConst16.types index cc9d0f1a2ca..5655b1f8f15 100644 --- a/tests/baselines/reference/downlevelLetConst16.types +++ b/tests/baselines/reference/downlevelLetConst16.types @@ -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 diff --git a/tests/baselines/reference/initializedDestructuringAssignmentTypes.errors.txt b/tests/baselines/reference/initializedDestructuringAssignmentTypes.errors.txt new file mode 100644 index 00000000000..9a8cb12b45b --- /dev/null +++ b/tests/baselines/reference/initializedDestructuringAssignmentTypes.errors.txt @@ -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'. \ No newline at end of file diff --git a/tests/baselines/reference/initializedDestructuringAssignmentTypes.js b/tests/baselines/reference/initializedDestructuringAssignmentTypes.js new file mode 100644 index 00000000000..ee38f30ef5f --- /dev/null +++ b/tests/baselines/reference/initializedDestructuringAssignmentTypes.js @@ -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(); diff --git a/tests/baselines/reference/initializedDestructuringAssignmentTypes.symbols b/tests/baselines/reference/initializedDestructuringAssignmentTypes.symbols new file mode 100644 index 00000000000..7d9cf531f0d --- /dev/null +++ b/tests/baselines/reference/initializedDestructuringAssignmentTypes.symbols @@ -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)) + diff --git a/tests/baselines/reference/initializedDestructuringAssignmentTypes.types b/tests/baselines/reference/initializedDestructuringAssignmentTypes.types new file mode 100644 index 00000000000..55ddfa4f56b --- /dev/null +++ b/tests/baselines/reference/initializedDestructuringAssignmentTypes.types @@ -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 + diff --git a/tests/cases/compiler/initializedDestructuringAssignmentTypes.ts b/tests/cases/compiler/initializedDestructuringAssignmentTypes.ts new file mode 100644 index 00000000000..bc3ec4ca407 --- /dev/null +++ b/tests/cases/compiler/initializedDestructuringAssignmentTypes.ts @@ -0,0 +1,3 @@ +const [, a = ''] = ''.match('') || []; + +a.toFixed() \ No newline at end of file