The following code is more or less a copy of what appears in the docs:
from starlette.applications import Starlette
from strawberry.asgi import GraphQL
from .schema import schema
app = Starlette()
graphql = GraphQL[None, None](schema)
app.add_route("/graphql", route=graphql)
However, it raises the following typing error:
app.py:8: error: Argument 2 to "add_route" of "Starlette" has incompatible type "GraphQL[Any, Any]"; expected "Callable[[Request], Awaitable[Response] | Response]" [arg-type]
app.py:8: note: "GraphQL[Any, Any].__call__" has type "Callable[[Arg(MutableMapping[str, Any], 'scope'), Arg(Callable[[], Awaitable[MutableMapping[str, Any]]], 'receive'), Arg(Callable[[MutableMapping[str, Any]], Awaitable[None]], 'send')], Coroutine[Any, Any, None]]"
While the code does actually run and appears to function correctly, Mypy is flagging incompatible signatures.
The signature for the route
parameter for the add_route
method:
(Request) -> (Awaitable[Response] | Response)
The signature of the GraphQL.__call__
method:
(Scope, Receive, Send) -> (None)
The latter signature is the same as the signature for Starlette middleware. I'm presuming Mypy is getting confused, or something isn't properly deliniated to Mypy and it's assuming something it shouldn't be, as the code does work.
It's also worth noting that the documentation should be updated to use full type annotations.
Starlette version 0.37.2.
Pay now to fund the work behind this issue.
Get updates on progress being made.
Maintainer is rewarded once the issue is completed.
You're funding impactful open source efforts
You want to contribute to this effort
You want to get funding like this too