{"record":{"id":"0d39d2ae0061ffb0","repo":"reflex-dev/reflex","slug":"expected-return-type-of-fn-name-to-be-a-var-0d39d2","errorCode":null,"errorMessage":"Expected return type of {fn.__name__} to be a Var, got {fn_return}.","messagePattern":"Expected return type of (.+?) to be a Var, got (.+?)\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/vars/base.py","lineNumber":3418,"sourceCode":"        TypeError: If the first argument of the function is not a Var.\n        TypeError: If the first argument of the function does not have a generic type\n    \"\"\"\n    result_origin_var_type = get_origin(result_var_type) or result_var_type\n\n    if result_origin_var_type in dispatchers:\n        fn = dispatchers[result_origin_var_type]\n        fn_types = get_type_hints(fn)\n        fn_first_arg_type = fn_types.get(\n            next(iter(inspect.signature(fn).parameters.values())).name, Any\n        )\n\n        fn_return = fn_types.get(\"return\", Any)\n\n        fn_return_origin = get_origin(fn_return) or fn_return\n\n        if fn_return_origin is not Var:\n            msg = f\"Expected return type of {fn.__name__} to be a Var, got {fn_return}.\"\n            raise TypeError(msg)\n\n        fn_return_generic_args = get_args(fn_return)\n\n        if not fn_return_generic_args:\n            msg = f\"Expected generic type of {fn_return} to be a type.\"\n            raise TypeError(msg)\n\n        arg_origin = get_origin(fn_first_arg_type) or fn_first_arg_type\n\n        if arg_origin is not Var:\n            msg = f\"Expected first argument of {fn.__name__} to be a Var, got {fn_first_arg_type}.\"\n            raise TypeError(msg)\n\n        arg_generic_args = get_args(fn_first_arg_type)\n\n        if not arg_generic_args:\n            msg = f\"Expected generic type of {fn_first_arg_type} to be a type.\"\n            raise TypeError(msg)","sourceCodeStart":3400,"sourceCodeEnd":3436,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/vars/base.py#L3400-L3436","documentation":"A stricter validation path for Var operator functions: the return annotation (after unwrapping its origin) must be Var; anything else raises TypeError naming the offending annotation.","triggerScenarios":"Registering an operator attribute function whose return annotation is not Var[...] (e.g. -> int, -> str, -> None) with the attribute-dispatch decorator.","commonSituations":"Writing custom Var attributes (like .length() style helpers) and forgetting the Var return annotation.","solutions":["Change the return annotation to Var[T]","Run pyright/mypy on the extension module to catch annotation mistakes before runtime"],"exampleFix":"# before\ndef items_length(v: Var[list[int]]) -> int: ...\n# after\ndef items_length(v: Var[list[int]]) -> Var[int]: ...","handlingStrategy":"type-guard","validationCode":"from typing import get_origin\nfrom reflex.vars import Var\nrt = fn.__annotations__.get('return', None)\nassert (get_origin(rt) or rt) is Var, 'operator fn must return Var[...]'","typeGuard":"def is_var_returning(fn) -> bool:\n    from typing import get_origin\n    from reflex.vars import Var\n    rt = fn.__annotations__.get('return')\n    return (get_origin(rt) or rt) is Var","tryCatchPattern":null,"preventionTips":["Run pyright on custom Var operator modules","Use Var[T] consistently for inputs and outputs"],"tags":["reflex","type-annotation","operator-dispatch"],"backgroundTag":"missing-type-annotation","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}