diff --git a/reflex/vars.py b/reflex/vars.py index df2000276b..3fba2bddef 100644 --- a/reflex/vars.py +++ b/reflex/vars.py @@ -572,11 +572,10 @@ def __getitem__(self, i: Any) -> Var: ) # Get the type of the indexed var. - type_ = ( - types.get_args(self._var_type)[0] - if types.is_generic_alias(self._var_type) - else Any - ) + if types.is_generic_alias(self._var_type): + type_ = types.get_args(self._var_type)[0] + elif types._issubclass(self._var_type, str): + type_ = str # Use `at` to support negative indices. return self._replace( diff --git a/tests/test_var.py b/tests/test_var.py index 2441b13e93..5833e28f0a 100644 --- a/tests/test_var.py +++ b/tests/test_var.py @@ -406,6 +406,22 @@ def test_var_indexing_lists(var): assert str(var[-1]) == f"{{{var._var_name}.at(-1)}}" +def test_var_indexing_str(): + """Test that we can index into str vars.""" + str_var = BaseVar(_var_name="str", _var_type=str) + + # Test that indexing gives a type of Var[str]. + assert isinstance(str_var[0], Var) + assert str_var[0]._var_type == str + + # Test basic indexing. + assert str(str_var[0]) == "{str.at(0)}" + assert str(str_var[1]) == "{str.at(1)}" + + # Test negative indexing. + assert str(str_var[-1]) == "{str.at(-1)}" + + @pytest.mark.parametrize( "var, index", [