diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 12b55aa818b..1178276fc9b 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -1,4 +1,4 @@
-///
+///
///
/* @internal */
@@ -18606,7 +18606,7 @@ namespace ts {
// unknownType is returned i.e. if node.expression is identifier whose name cannot be resolved
// in this case error about missing name is already reported - do not report extra one
- if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, TypeFlags.Object | TypeFlags.TypeVariable)) {
+ if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, TypeFlags.Object | TypeFlags.TypeVariable | TypeFlags.NonPrimitive)) {
error(node.expression, Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter);
}
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForIn.js b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.js
new file mode 100644
index 00000000000..c5f4319c748
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.js
@@ -0,0 +1,13 @@
+//// [nonPrimitiveIndexingWithForIn.ts]
+var a: object;
+
+for (var key in a) {
+ var value = a[key];
+}
+
+
+//// [nonPrimitiveIndexingWithForIn.js]
+var a;
+for (var key in a) {
+ var value = a[key];
+}
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForIn.symbols b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.symbols
new file mode 100644
index 00000000000..3cb41269541
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.symbols
@@ -0,0 +1,14 @@
+=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForIn.ts ===
+var a: object;
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForIn.ts, 0, 3))
+
+for (var key in a) {
+>key : Symbol(key, Decl(nonPrimitiveIndexingWithForIn.ts, 2, 8))
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForIn.ts, 0, 3))
+
+ var value = a[key];
+>value : Symbol(value, Decl(nonPrimitiveIndexingWithForIn.ts, 3, 7))
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForIn.ts, 0, 3))
+>key : Symbol(key, Decl(nonPrimitiveIndexingWithForIn.ts, 2, 8))
+}
+
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForIn.types b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.types
new file mode 100644
index 00000000000..44e2b3f4d50
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForIn.types
@@ -0,0 +1,15 @@
+=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForIn.ts ===
+var a: object;
+>a : object
+
+for (var key in a) {
+>key : string
+>a : object
+
+ var value = a[key];
+>value : any
+>a[key] : any
+>a : object
+>key : string
+}
+
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.errors.txt b/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.errors.txt
new file mode 100644
index 00000000000..f7f2ee3db16
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.errors.txt
@@ -0,0 +1,12 @@
+tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInNoImplicitAny.ts(4,17): error TS7017: Element implicitly has an 'any' type because type '{}' has no index signature.
+
+
+==== tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInNoImplicitAny.ts (1 errors) ====
+ var a: object;
+
+ for (var key in a) {
+ var value = a[key]; // error
+ ~~~~~~
+!!! error TS7017: Element implicitly has an 'any' type because type '{}' has no index signature.
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.js b/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.js
new file mode 100644
index 00000000000..e105e5ba9bb
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForInNoImplicitAny.js
@@ -0,0 +1,13 @@
+//// [nonPrimitiveIndexingWithForInNoImplicitAny.ts]
+var a: object;
+
+for (var key in a) {
+ var value = a[key]; // error
+}
+
+
+//// [nonPrimitiveIndexingWithForInNoImplicitAny.js]
+var a;
+for (var key in a) {
+ var value = a[key]; // error
+}
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.js b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.js
new file mode 100644
index 00000000000..ce575b2a4d6
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.js
@@ -0,0 +1,13 @@
+//// [nonPrimitiveIndexingWithForInSupressError.ts]
+var a: object;
+
+for (var key in a) {
+ var value = a[key];
+}
+
+
+//// [nonPrimitiveIndexingWithForInSupressError.js]
+var a;
+for (var key in a) {
+ var value = a[key];
+}
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.symbols b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.symbols
new file mode 100644
index 00000000000..4e52e66b1c0
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.symbols
@@ -0,0 +1,14 @@
+=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInSupressError.ts ===
+var a: object;
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 0, 3))
+
+for (var key in a) {
+>key : Symbol(key, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 2, 8))
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 0, 3))
+
+ var value = a[key];
+>value : Symbol(value, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 3, 7))
+>a : Symbol(a, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 0, 3))
+>key : Symbol(key, Decl(nonPrimitiveIndexingWithForInSupressError.ts, 2, 8))
+}
+
diff --git a/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.types b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.types
new file mode 100644
index 00000000000..3fafa40b596
--- /dev/null
+++ b/tests/baselines/reference/nonPrimitiveIndexingWithForInSupressError.types
@@ -0,0 +1,15 @@
+=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInSupressError.ts ===
+var a: object;
+>a : object
+
+for (var key in a) {
+>key : string
+>a : object
+
+ var value = a[key];
+>value : any
+>a[key] : any
+>a : object
+>key : string
+}
+
diff --git a/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForIn.ts b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForIn.ts
new file mode 100644
index 00000000000..2ec8cf83cb7
--- /dev/null
+++ b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForIn.ts
@@ -0,0 +1,5 @@
+var a: object;
+
+for (var key in a) {
+ var value = a[key];
+}
diff --git a/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInNoImplicitAny.ts b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInNoImplicitAny.ts
new file mode 100644
index 00000000000..1050cdea497
--- /dev/null
+++ b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInNoImplicitAny.ts
@@ -0,0 +1,6 @@
+// @noImplicitAny: true
+var a: object;
+
+for (var key in a) {
+ var value = a[key]; // error
+}
diff --git a/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInSupressError.ts b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInSupressError.ts
new file mode 100644
index 00000000000..3f63faee604
--- /dev/null
+++ b/tests/cases/conformance/types/nonPrimitive/nonPrimitiveIndexingWithForInSupressError.ts
@@ -0,0 +1,7 @@
+// @noImplicitAny: true
+// @suppressImplicitAnyIndexErrors: true
+var a: object;
+
+for (var key in a) {
+ var value = a[key];
+}