diff --git a/reflex/ivars/base.py b/reflex/ivars/base.py index 27c4828af..8bb7957c4 100644 --- a/reflex/ivars/base.py +++ b/reflex/ivars/base.py @@ -416,7 +416,7 @@ class ImmutableVar(Var, Generic[VAR_TYPE]): return ToArrayOperation.create(self, var_type or list) if issubclass(output, StringVar): - return ToStringOperation.create(self) + return ToStringOperation.create(self, var_type or str) if issubclass(output, (ObjectVar, Base)): return ToObjectOperation.create(self, var_type or dict) @@ -496,7 +496,7 @@ class ImmutableVar(Var, Generic[VAR_TYPE]): if issubclass(fixed_type, (list, tuple, set)): return self.to(ArrayVar, self._var_type) if issubclass(fixed_type, str): - return self.to(StringVar) + return self.to(StringVar, self._var_type) if issubclass(fixed_type, Base): return self.to(ObjectVar, self._var_type) return self diff --git a/tests/test_var.py b/tests/test_var.py index 5902590f5..460cee39e 100644 --- a/tests/test_var.py +++ b/tests/test_var.py @@ -1,7 +1,7 @@ import json import math import typing -from typing import Dict, List, Set, Tuple, Union +from typing import Dict, List, Optional, Set, Tuple, Union, cast import pytest from pandas import DataFrame @@ -1756,3 +1756,21 @@ def test_invalid_computed_var_deps(deps: List): ) def test_var(state) -> int: return 1 + + +def test_to_string_operation(): + class Email(str): ... + + class TestState(BaseState): + optional_email: Optional[Email] = None + email: Email = Email("test@reflex.dev") + + assert ( + str(TestState.optional_email) == f"{TestState.get_full_name()}.optional_email" + ) + my_state = TestState() + assert my_state.optional_email is None + assert my_state.email == "test@reflex.dev" + + assert cast(ImmutableVar, TestState.email)._var_type == Email + assert cast(ImmutableVar, TestState.optional_email)._var_type == Optional[Email]