{"record":{"id":"fa00f1838f70a6b6","repo":"reflex-dev/reflex","slug":"expected-generic-type-of-fn-first-arg-type-to-be","errorCode":null,"errorMessage":"Expected generic type of {fn_first_arg_type} to be a type.","messagePattern":"Expected generic type of (.+?) to be a type\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/vars/base.py","lineNumber":3436,"sourceCode":"            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)\n\n        fn_return_type = fn_return_generic_args[0]\n\n        var = (\n            Var(\n                field_name,\n                _var_data=var_data,\n                _var_type=fn_return_type,\n            ).guess_type()\n            if existing_var is None\n            else existing_var._replace(\n                _var_type=fn_return_type,\n                _var_data=var_data,\n                _js_expr=field_name,\n            ).guess_type()\n        )\n\n        return fn(var)","sourceCodeStart":3418,"sourceCodeEnd":3454,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/vars/base.py#L3418-L3454","documentation":"The first argument must be a fully parameterized Var[T]; a bare Var without a generic argument gives the dispatcher nothing to dispatch on, so it raises TypeError.","triggerScenarios":"def op(v: Var) -> Var[int] — the first parameter is annotated as bare, non-generic Var.","commonSituations":"Quickly annotated custom operators using plain Var.","solutions":["Parameterize the first argument: v: Var[int], v: Var[str], etc."],"exampleFix":"# before\ndef upper(v: Var) -> Var[str]: ...\n# after\ndef upper(v: Var[str]) -> Var[str]: ...","handlingStrategy":"type-guard","validationCode":"from typing import get_args\nassert get_args(first_param_annotation), 'Var parameter must be parameterized'","typeGuard":"def takes_parameterized_var(fn) -> bool:\n    import inspect\n    from typing import get_args\n    p = next(iter(inspect.signature(fn).parameters.values()))\n    return bool(get_args(p.annotation))","tryCatchPattern":null,"preventionTips":["Use Var[int]/Var[str] etc. everywhere, never bare Var in dispatch signatures"],"tags":["reflex","type-annotation","generics"],"backgroundTag":"missing-generic-type-argument","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}