diff --git a/.changeset/polymorphic-as-generic-spread.md b/.changeset/polymorphic-as-generic-spread.md
new file mode 100644
index 000000000..820ee0beb
--- /dev/null
+++ b/.changeset/polymorphic-as-generic-spread.md
@@ -0,0 +1,5 @@
+---
+'@linaria/react': patch
+---
+
+Fix TypeScript inference for generic spread props on styled components (TS2698).
diff --git a/packages/react/__dtslint__/styled-jsx.tsx b/packages/react/__dtslint__/styled-jsx.tsx
index d4b73f7e6..9e61adbe1 100644
--- a/packages/react/__dtslint__/styled-jsx.tsx
+++ b/packages/react/__dtslint__/styled-jsx.tsx
@@ -9,3 +9,12 @@ const Button = styled.button``;
;
// @ts-expect-error href is not a button property
;
+
+declare function getProps<
+ T extends React.InputHTMLAttributes,
+>(props?: T): T;
+
+const Input = styled.input``;
+
+// A spread of a generic call must not depend on the `as` overload.
+;
diff --git a/packages/react/src/styled.ts b/packages/react/src/styled.ts
index 28cb6adad..cfe200120 100644
--- a/packages/react/src/styled.ts
+++ b/packages/react/src/styled.ts
@@ -273,6 +273,11 @@ type IntrinsicElementProps =
keyof IntrinsicElements extends TName ? unknown : IntrinsicElements[TName];
type StyledComponentWithAs = {
+ // Tried first so that inference in JSX does not have to go through the generic `as` overload.
+ (
+ props: TProps & { as?: undefined },
+ context?: any
+ ): ReturnType>;
(
props: TProps & { as: TAs } & NoInfer>,
context?: any