From 4d6ef9a10cade33609c63db132810514d1253c1f Mon Sep 17 00:00:00 2001
From: Khaleel Al-Adhami <khaleel.aladhami@gmail.com>
Date: Wed, 5 Feb 2025 15:29:01 -0800
Subject: [PATCH] stronger checking and tests

---
 reflex/vars/object.py                    |  4 +++-
 tests/integration/test_var_operations.py | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/reflex/vars/object.py b/reflex/vars/object.py
index 2de511e01..3700452a4 100644
--- a/reflex/vars/object.py
+++ b/reflex/vars/object.py
@@ -187,11 +187,13 @@ class ObjectVar(Var[OBJECT_TYPE], python_types=Mapping):
         Returns:
             The item from the object.
         """
+        from .sequence import LiteralStringVar
+
         if not isinstance(key, (StringVar, str, int, NumberVar)) or (
             isinstance(key, NumberVar) and key._is_strict_float()
         ):
             raise_unsupported_operand_types("[]", (type(self), type(key)))
-        if isinstance(key, str):
+        if isinstance(key, str) and isinstance(Var.create(key), LiteralStringVar):
             return self.__getattr__(key)
         return ObjectItemOperation.create(self, key).guess_type()
 
diff --git a/tests/integration/test_var_operations.py b/tests/integration/test_var_operations.py
index a5a74c9ee..16885cd06 100644
--- a/tests/integration/test_var_operations.py
+++ b/tests/integration/test_var_operations.py
@@ -10,6 +10,8 @@ from reflex.testing import AppHarness
 
 def VarOperations():
     """App with var operations."""
+    from typing import TypedDict
+
     import reflex as rx
     from reflex.vars.base import LiteralVar
     from reflex.vars.sequence import ArrayVar
@@ -17,6 +19,10 @@ def VarOperations():
     class Object(rx.Base):
         name: str = "hello"
 
+    class Person(TypedDict):
+        name: str
+        age: int
+
     class VarOperationState(rx.State):
         int_var1: rx.Field[int] = rx.field(10)
         int_var2: rx.Field[int] = rx.field(5)
@@ -34,6 +40,9 @@ def VarOperations():
         dict1: rx.Field[dict[int, int]] = rx.field({1: 2})
         dict2: rx.Field[dict[int, int]] = rx.field({3: 4})
         html_str: rx.Field[str] = rx.field("<div>hello</div>")
+        people: rx.Field[list[Person]] = rx.field(
+            [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]
+        )
 
     app = rx.App(_state=rx.State)
 
@@ -619,6 +628,15 @@ def VarOperations():
                 ),
                 id="dict_in_foreach3",
             ),
+            rx.box(
+                rx.foreach(
+                    VarOperationState.people,
+                    lambda person: rx.text.span(
+                        "Hello " + person["name"], person["age"] + 3
+                    ),
+                ),
+                id="typed_dict_in_foreach",
+            ),
         )
 
 
@@ -826,6 +844,7 @@ def test_var_operations(driver, var_operations: AppHarness):
         ("dict_in_foreach1", "a1b2"),
         ("dict_in_foreach2", "12"),
         ("dict_in_foreach3", "1234"),
+        ("typed_dict_in_foreach", "Hello Alice33Hello Bob28"),
     ]
 
     for tag, expected in tests: