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("
hello
") + 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: