Browse Source

improve var create typing (#4701)

Khaleel Al-Adhami 3 months ago
parent
commit
5beea25b31

+ 2 - 1
reflex/components/radix/primitives/accordion.py

@@ -196,8 +196,9 @@ class AccordionItem(AccordionComponent):
 
     # The header of the accordion item.
     header: Var[Union[Component, str]]
+
     # The content of the accordion item.
-    content: Var[Union[Component, str]] = Var.create(None)
+    content: Var[Union[Component, str, None]] = Var.create(None)
 
     _valid_children: List[str] = [
         "AccordionHeader",

+ 3 - 1
reflex/components/radix/primitives/accordion.pyi

@@ -308,7 +308,9 @@ class AccordionItem(AccordionComponent):
         value: Optional[Union[Var[str], str]] = None,
         disabled: Optional[Union[Var[bool], bool]] = None,
         header: Optional[Union[Component, Var[Union[Component, str]], str]] = None,
-        content: Optional[Union[Component, Var[Union[Component, str]], str]] = None,
+        content: Optional[
+            Union[Component, Var[Optional[Union[Component, str]]], str]
+        ] = None,
         color_scheme: Optional[
             Union[
                 Literal[

+ 51 - 2
reflex/vars/base.py

@@ -80,6 +80,7 @@ if TYPE_CHECKING:
 
 VAR_TYPE = TypeVar("VAR_TYPE", covariant=True)
 OTHER_VAR_TYPE = TypeVar("OTHER_VAR_TYPE")
+STRING_T = TypeVar("STRING_T", bound=str)
 
 warnings.filterwarnings("ignore", message="fields may not start with an underscore")
 
@@ -550,12 +551,60 @@ class Var(Generic[VAR_TYPE]):
 
         return value_with_replaced
 
+    @overload
+    @classmethod
+    def create(  # type: ignore[override]
+        cls,
+        value: bool,
+        _var_data: VarData | None = None,
+    ) -> BooleanVar: ...
+
+    @overload
+    @classmethod
+    def create(  # type: ignore[override]
+        cls,
+        value: int,
+        _var_data: VarData | None = None,
+    ) -> NumberVar[int]: ...
+
+    @overload
     @classmethod
     def create(
         cls,
-        value: Any,
+        value: float,
         _var_data: VarData | None = None,
-    ) -> Var:
+    ) -> NumberVar[float]: ...
+
+    @overload
+    @classmethod
+    def create(
+        cls,
+        value: STRING_T,
+        _var_data: VarData | None = None,
+    ) -> StringVar[STRING_T]: ...
+
+    @overload
+    @classmethod
+    def create(
+        cls,
+        value: None,
+        _var_data: VarData | None = None,
+    ) -> NoneVar: ...
+
+    @overload
+    @classmethod
+    def create(
+        cls,
+        value: OTHER_VAR_TYPE,
+        _var_data: VarData | None = None,
+    ) -> Var[OTHER_VAR_TYPE]: ...
+
+    @classmethod
+    def create(
+        cls,
+        value: OTHER_VAR_TYPE,
+        _var_data: VarData | None = None,
+    ) -> Var[OTHER_VAR_TYPE]:
         """Create a var from a value.
 
         Args:

+ 1 - 1
reflex/vars/number.py

@@ -31,7 +31,7 @@ from .base import (
     var_operation_return,
 )
 
-NUMBER_T = TypeVar("NUMBER_T", int, float, Union[int, float], bool)
+NUMBER_T = TypeVar("NUMBER_T", int, float, bool)
 
 if TYPE_CHECKING:
     from .sequence import ArrayVar