diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a9e4ac7293f..f352f53286d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37933,7 +37933,7 @@ namespace ts { // For a binding pattern, validate the initializer and exit if (isBindingPattern(node.name)) { const needCheckInitializer = node.initializer && node.parent.parent.kind !== SyntaxKind.ForInStatement; - const needCheckWidenedType = node.name.elements.length === 0; + const needCheckWidenedType = !some(node.name.elements, not(isOmittedExpression)); if (needCheckInitializer || needCheckWidenedType) { // Don't validate for-in initializer as it is already an error const widenedType = getWidenedTypeForVariableLikeDeclaration(node); diff --git a/test.js b/test.js new file mode 100644 index 00000000000..ba63496c717 --- /dev/null +++ b/test.js @@ -0,0 +1,9 @@ +"use strict"; +exports.__esModule = true; +exports.main = void 0; +function main() { + for (var _i = 0, doesNotExist_1 = doesNotExist; _i < doesNotExist_1.length; _i++) { + var _a = doesNotExist_1[_i]; + } +} +exports.main = main; diff --git a/test.ts b/test.ts new file mode 100644 index 00000000000..9f0f9667697 --- /dev/null +++ b/test.ts @@ -0,0 +1,4 @@ +export function main() { + for (const [,] of doesNotExist) { + } +} \ No newline at end of file diff --git a/tests/baselines/reference/omittedExpressionForOfLoop.errors.txt b/tests/baselines/reference/omittedExpressionForOfLoop.errors.txt new file mode 100644 index 00000000000..145af55d190 --- /dev/null +++ b/tests/baselines/reference/omittedExpressionForOfLoop.errors.txt @@ -0,0 +1,26 @@ +tests/cases/compiler/omittedExpressionForOfLoop.ts(1,19): error TS2304: Cannot find name 'doesNotExist'. +tests/cases/compiler/omittedExpressionForOfLoop.ts(4,19): error TS2532: Object is possibly 'undefined'. +tests/cases/compiler/omittedExpressionForOfLoop.ts(7,12): error TS2488: Type 'never' must have a '[Symbol.iterator]()' method that returns an iterator. +tests/cases/compiler/omittedExpressionForOfLoop.ts(10,12): error TS2488: Type 'never' must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/compiler/omittedExpressionForOfLoop.ts (4 errors) ==== + for (const [,] of doesNotExist) { + ~~~~~~~~~~~~ +!!! error TS2304: Cannot find name 'doesNotExist'. + } + + for (const [,] of undefined) { + ~~~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + } + + for (const [,] of []) { + ~~~ +!!! error TS2488: Type 'never' must have a '[Symbol.iterator]()' method that returns an iterator. + } + + for (const [] of []) { + ~~ +!!! error TS2488: Type 'never' must have a '[Symbol.iterator]()' method that returns an iterator. + } \ No newline at end of file diff --git a/tests/baselines/reference/omittedExpressionForOfLoop.js b/tests/baselines/reference/omittedExpressionForOfLoop.js new file mode 100644 index 00000000000..6a96b3b73ed --- /dev/null +++ b/tests/baselines/reference/omittedExpressionForOfLoop.js @@ -0,0 +1,23 @@ +//// [omittedExpressionForOfLoop.ts] +for (const [,] of doesNotExist) { +} + +for (const [,] of undefined) { +} + +for (const [,] of []) { +} + +for (const [] of []) { +} + +//// [omittedExpressionForOfLoop.js] +"use strict"; +for (const [,] of doesNotExist) { +} +for (const [,] of undefined) { +} +for (const [,] of []) { +} +for (const [] of []) { +} diff --git a/tests/baselines/reference/omittedExpressionForOfLoop.symbols b/tests/baselines/reference/omittedExpressionForOfLoop.symbols new file mode 100644 index 00000000000..9ea7c1c04cf --- /dev/null +++ b/tests/baselines/reference/omittedExpressionForOfLoop.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/omittedExpressionForOfLoop.ts === +for (const [,] of doesNotExist) { +} + +for (const [,] of undefined) { +>undefined : Symbol(undefined) +} + +for (const [,] of []) { +} + +for (const [] of []) { +} diff --git a/tests/baselines/reference/omittedExpressionForOfLoop.types b/tests/baselines/reference/omittedExpressionForOfLoop.types new file mode 100644 index 00000000000..76ac26753b4 --- /dev/null +++ b/tests/baselines/reference/omittedExpressionForOfLoop.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/omittedExpressionForOfLoop.ts === +for (const [,] of doesNotExist) { +> : undefined +>doesNotExist : any +} + +for (const [,] of undefined) { +> : undefined +>undefined : undefined +} + +for (const [,] of []) { +> : undefined +>[] : never[] +} + +for (const [] of []) { +>[] : never[] +} diff --git a/tests/cases/compiler/omittedExpressionForOfLoop.ts b/tests/cases/compiler/omittedExpressionForOfLoop.ts new file mode 100644 index 00000000000..399cd1c1d87 --- /dev/null +++ b/tests/cases/compiler/omittedExpressionForOfLoop.ts @@ -0,0 +1,14 @@ +// @strict: true +// @target: es2015 + +for (const [,] of doesNotExist) { +} + +for (const [,] of undefined) { +} + +for (const [,] of []) { +} + +for (const [] of []) { +} \ No newline at end of file